畢業設計的程式主體編好了,執行少量資料沒有任何問題,一旦資料量增加到22w,執行時間就長得令人髮指。導師建議,程式中盡可能地減少與資料庫互動的次數,盡可能地把工作丟給資料庫完成。在這一思想的指導下,我三天大幅修改程式,部分**幾乎是翻新了一遍。總的來說,執行時間確實得到了很大的改善,把這三天的經驗總結一下。
1、update操作
使用preparestatement以batch方式提交。某個操作的執行時間從12min縮減到82s。
2、建立索引
如果使用select from where的操作,一定要為where後的屬性建立索引。否則在大表上進行此操作,時間非常長。如果用
show processlist檢視,發現query的狀態長時間停留在sending data。所以建索引很重要。
3、distinct
最好不要用distinct操作,非常耗時。我最初的儲存過程及**裡,都多次用到select count(distinct attribute),使得query執
行的時間非常長。網上有建議,如果語句為 select count(distinct attribute) from table_name where,可以優化為
select count(distinct attribute) from (select attribute from table_name where ) as t, t是table_name的別名。
4、儲存過程
游標申明後,沒有開啟時,不能使用select into操作,有解釋說select into其實是乙個隱式游標。所有我 只好把select into寫進
了游標的迴圈裡。等下要再試一試,在open cursor和fetch之間,寫入select into,看是否能夠成功。
儲存過程裡,不支援陣列,真的很不方便。我有200個變數要宣告,只能乙個乙個地寫,乙個乙個地賦值。從資料庫設計的原理來
說,一張表的屬性不能太多,我某一張表創紀錄地達到了122個屬性。如果分割成若干個小表,從原理上也是可行的,但是要增加
很多select操作並且要跨越多表,既麻煩,而且耗時也會更長。因為這張表是演算法執行中生成的臨時表,所以屬性多、不符合正規化
要求,也就沒關係了。但至少我的經驗證明,mysql一張表的屬性個數<=122都是沒有任何問題的。
5、相同屬性的統計
演算法中有這樣的乙個要求,統計2條tuple相同的屬性個數,2條tuple位於同乙個表,都有100個屬性。我最初使用 select count
(distinct att1)+ count(distinct att2)+...+count(distinct att100) from table_name where id=t_id1 or id=t_id2, 最初
對這個語句還是很滿意的,至少比較的功能都由sql完成。但一執行,就發現速度超慢無比,時間瓶頸在於distinct操作。本來想找一
個distinct實現的原理,但mysql文件和網上似乎都沒有。
只好另外想辦法解決,用了很愚蠢的方法。先select att1, att2,..., att100 into a_att1,a_att2,... a_att100 from
table_name where id=t_id1,select att1, att2,..., att100 into b_att1,b_att2,... b_att100 from table_name
where id=t_id2。 然後使用了100個if(a_att1=b_att1)語句進行判斷,並用乙個int 變數記錄相似的結果數。
功能順利實現了,時間也減少了很多很多。最初儲存過程執行一次,需要5-7s,修改後只需要0.01-0.02s。 雖然方法愚蠢,而且
需要宣告很多臨時變數,但總歸機械的勞動帶來了一點回報。
暫且總結到這裡,明天去找導師。
MySQL使用總結
預設情況下是否區分大小寫 影響表名 欄位名 varchar欄位內容 使用show variables like table names 檢視lower case table names的值,0代表區分,1代表不區分。設定為不區分時,實際建立時表名將全部儲存為小寫字母,欄位名為原樣,字段內容為原樣。a...
mysql日常使用總結
1.在mysql中 double型別字段 不能指定長度,如 alter table pur purchase item config history change column safe stock day safe stock day double 20 not null comment 安全水位...
mysql 索引使用總結
select 語句是否用到了索引,可以使用mysql的 explain 來執行後檢視。下面做乙個比較基礎的總結。normal 普通索引 unique 唯一索引 fulltext 文字索引 alter table t user add index idx name name 說下字段的意思 表示資料來...