MySQL單表已使用索引但查詢大資料結果時慢的解決辦法
阿新 • • 發佈:2018-12-21
目前做的專案使用MySQL資料庫,其中有張表包含近1000萬條記錄,表結構如下:
Field | Type | Comment |
id | int(11) NOT NULL | 主鍵(PK) |
year | int(4) NULL | 資料年份 |
companyId | int(11) NULL | 公司主鍵 |
elementTemplateId | int(11) NULL | 元素主鍵 |
period | tinyint(1) NULL | 期間 |
value | decimal(20,2) NULL | 值 |
memo | varchar(1000) NULL | 備註 |
status | tinyint(1) NULL | 狀態(1:有效;0:無效) |
createUserId | int(11) NULL | 建立人主鍵 |
createTime | datetime NULL | 建立時間 |
modifyUserId | int(11) NULL | 修改人主鍵 |
modifyTime | datetime NULL | 修改時間 |
包含索引如下:
Indexes | Columns | Index Type |
---|---|---|
PRIMARY | id | Unique |
Composite1 | companyId, year, period, elementTemplateId | Unique |
表型別為innodb,在執行某個查詢語句時會返回大於30萬條結果,耗時5秒左右,SQL語句使用到了Composite1索引,explain檢查索引type型別為range,SQL如下:
SELECT year, elementTemplateId, value
FROM Base_Proportion_ConsBalanceSheet
WHERE companyId IN (id1, id2, id3, ......, idn) AND year=xxx AND period=x AND status = 1
由於這只是最簡單的單表查詢,感覺在SQL上好像沒有什麼能優化的地方了(如果有的話望各位看官給予指點),於是考慮修改MySQL的配置,在my.ini中有3處地方可以修改innodb_buffer_pool_size、innodb_log_buffer_size和innodb_log_file_size,其中最重要的就是innodb_buffer_pool_size(引數作用就不解釋了,看名字就能大致猜到,網上一搜一大堆),該引數預設值為8M,我們伺服器是32G的記憶體,所以我設了8192M,innodb_log_buffer_size設了16M,innodb_log_file_size設了256M(後2個引數使用預設的也可以,主要是第一個引數),修改完後重啟MySQL,執行上述語句從原來的5秒左右提升到了1秒左右,效果還是很明顯的。