昨天遇到乙個問題:
在一張有三十萬條紀錄的資料表a,其主鍵自增字段id,name欄位(varchar),還有type_id(int),在name欄位上已經新增了索引。type_id由於是整型字段,認為加索引沒有太多的意義,所以沒有加索引。
本次有乙個需求是在乙個迴圈中按type_id查詢此表a,結果一執行此迴圈,mysql立刻占用cpu到200%以上,導致伺服器響應極慢。
開始沒想到是查詢速度的問題,後來發現換乙個表,cpu佔用率立刻下降。於是分析了查詢過詢,發現每次查詢都要遍歷整表,所以資料庫壓力非常大。手工直接使用sql在資料庫查詢:
select * from a where type_id = ***x
執行時間約為0.42s(400ms左右),速度較慢。
於是在type_id上新增索引,然後再執行同條語句。
執行時間為0.01s(10ms左右),速度明顯提公升(40倍左右)。
再執行迴圈,發現cpu占用8%左右,比較理想。
效能提公升的原因分析:
type_id的值有特殊性:大部分type_id的值為0,索引效果明顯。正好本次查詢不需要查詢type_id為0的紀錄。如果要查詢type_id為0的紀錄,則效果提公升可能不明顯。
體會:(1)在遇到查詢效能的時候,適當的分析資料,新增索引,可能能大幅提高效能。
(2)是否新增索引,需要考量資料總量及資料更新頻度再做決定。
(3)分析一條語句是否使用了索引。可使用 explain sql;
如explain select * from a where type_id = ***x 會顯示是否使用索引。
mysql給表的字段加索引
1 新增普通索引 alter table table name add index index name column 2 新增主鍵索引 alter table table name addprimary key column 3 新增唯一索引 unique alter table table na...
記錄一次給mysql加日期分割槽的經歷
使用range建立分割槽,先是在本地5.0.45版本mysql上建立,一直失敗。於是到測試伺服器5.5.35上建立,也失敗,而且錯誤提示資訊模糊。於是從網上最簡單的做起,最後發現,跟表的主鍵有關係,如果有id主鍵,又想使用time來做分割槽,那麼需要將主鍵設定為 create table t id ...
MySQL 大資料表新增索引
為了提公升資料庫的查詢速度需要在資料表中的字段上新增索引,但是表中的資料量很大的時候,直接新增索引會導致資料庫崩潰或者鎖表時間太長而影響對資料庫的操作 建立一張臨時的新錶,複製舊表的結構及其索引 create table new table like old table 新錶中新增新增的字段,增加索...