1. 程式人生 > >MySQL單表已使用索引但查詢大資料結果時慢的解決辦法

MySQL單表已使用索引但查詢大資料結果時慢的解決辦法

目前做的專案使用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秒左右,效果還是很明顯的。