接手別人的**,遇到乙個客戶需求,說介面查詢較慢,需要進行優化。
後面通過列印執行時間定位到是某一句sql執行較慢。
sql如下
select
*from t_base_alarm tba where1=
1and tba.rule_type =
1order
by alarm_status asc
,end_ts desc
limit1,
10
通過執行計畫判斷
分析可知,這個查詢是全表掃瞄。
後面給rule_type 和alarm_status 和end_ts 建立聯合索引。(這裡一定要給這三個字段建立聯合索引)如果單獨給rule_type 或者alarm_status 和end_ts 單獨建立索引,索引都不會生效。具體原因,可以參考該文章的描述:
建立聯合索引的語句如下
create
index index_union on t_base_alarm(rule_type,alarm_status,end_ts)
;
再次檢視執行計畫,發現索引已被利用上。
至此優化結束
最開始我只給rule_type 建立索引,但是發現查詢依舊很慢。這是因為order by 需要根據alarm_status,end_ts這兩個字段進行排序。而這兩個字段即使單獨設定索引,速度一樣提不上來。必須要給order by 後alarm_status,end_ts兩個欄位和where 後的rule_tye同時設定聯合索引才能充分。
mysql order by 排序技巧
首先我們新建表test,如下 create table test id int 11 not null auto increment,name varchar 255 default null,primary key id engine innodb auto increment 7 default...
Mysql order by 多欄位排序
降序desc 由大到小 公升序asc 由小到大 mysql單個字段降序排序 select from table order by id desc mysql單個字段公升序排序 select from table order by id asc mysql多個字段排序 select from tabl...
mysql order by 排序的問題
參考部落格 mysql order by 的排序在今天時候遇到了問題 情景是 將排序的字段設定成varchar型別了,然後排序時候並沒有按從大到小的順序 按照圖中的順序應該是正序,9排在最上邊,但是實際上是666排在最上邊 解決辦法之一 實際情況是先按最左邊的開始排序然後在一位一位比下去,這裡在寫s...