今天資料庫負載就直線上公升,資料庫連線數撐爆。把語句抓出來一看,罪魁禍首是一條很簡單的語句:select * from eload_promotion_code where 1 and exp_time<1478782591 and cishu=0 order by id desc limit 454660,20; 二話不說先把這個語句kill了,然後慢慢看怎麼優化。
先看一下這個表的索引:
>show index from eload_promotion_code\g
*************************** 1. row ***************************
table: eload_promotion_code
non_unique: 0
key_name: primary
seq_in_index: 1
column_name: id
collation: a
cardinality: 921642
sub_part: null
packed: null
null:
index_type: btree
comment:
index_comment:
*************************** 2. row ***************************
table: eload_promotion_code
non_unique: 1
key_name: idx_cishu_exp
seq_in_index: 1
column_name: cishu
collation: a
cardinality: 15
sub_part: null
packed: null
null:
index_type: btree
comment:
index_comment:
*************************** 3. row ***************************
table: eload_promotion_code
non_unique: 1
key_name: idx_cishu_exp
seq_in_index: 2
column_name: exp_time
collation: a
cardinality: 921642
sub_part: null
packed: null
null:
index_type: btree
comment:
index_comment:
可以看到id為主鍵,idx_cishu_exp為(cishu,exp_time)的唯一索引
看一下這個語句的執行計畫,可以看到排序沒有用到索引
explain select * from eload_promotion_code where 1 and exp_time<1478782591 and cishu=0 order by id desc limit 454660,20\g
*************************** 1. row ***************************
id: 1
select_type: ******
table: eload_promotion_code
type: ref
possible_keys: idx_cishu_exp
key: idx_cishu_exp
key_len: 4
ref: const
rows: 460854
extra: using where; using filesort
1 row in set (0.00 sec)
將select * 換成select id後再看執行計畫,可以用索引覆蓋
>explain select id from eload_promotion_code where 1 and exp_time<1478782591 and cishu=0 order by id desc limit 454660,20 \g
*************************** 1. row ***************************
id: 1
select_type: ******
table: eload_promotion_code
type: range
possible_keys: idx_cishu_exp
key: idx_cishu_exp
key_len: 8
ref: null
rows: 460862
extra: using where; using index; using filesort
1 row in set (0.00 sec)
好吧,這個語句有救了,採用延時關聯先取出id,然後根據id獲取原表所需要的行,改寫後的語句來了:select * from eload_promotion_code inner join (select id from eload_promotion_code where exp_time<1478782591 and cishu=0 order by id desc limit 454660,20) as x on eload_promotion_code.id=x.id;
執行一下,0.3s出結果。
這樣就算完了。
mysql倒排字段型別 mysql倒排的優化
今天資料庫負載就直線上公升,資料庫連線數撐爆。把語句抓出來一看,罪魁禍首是一條很簡單的語句 select from eload promotion code where 1 and exp time 1478782591 and cishu 0 order by id desc limit 4546...
mysql的優化 MySQL優化
一 sql語句優化 1 使用limit對查詢結果的記錄進行限定 2 避免select 將需要查詢的字段列出來 3 使用連線 join 來代替子查詢 4 拆分大的delete或insert語句 二 選擇合適的資料型別 1 使用可存下資料的最小的資料型別,整型 date,time char,varcha...
大檔案查詢優化方案之倒排索引
1.倒排索引 正排索引與倒排索引 咱們先來看什麼是倒排索引,以及倒排索引與正排索引之間的區別 接下來,闡述下正排索引與倒排索引的區別 一般索引 正排索引 正排表是以文件的id 為關鍵字,表中記錄文件中每個字的位置資訊,查詢時掃瞄表中每個文件中字的資訊直到找出所有包含查詢關鍵字的文件。正排表結構如圖 ...