今天資料庫負載就直線上公升,資料庫連線數撐爆。把語句抓出來一看,罪魁禍首是一條很簡單的語句: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欄位型別最全解析
前言 要了解乙個資料庫,我們必須了解其支援的資料型別。mysql 支援大量的字段型別,其中常用的也有很多。前面文章我們也講過 int 及 varchar 型別的用法,但一直沒有全面講過字段型別,本篇文章我們將把字段型別一網打盡,講一講常用字段型別的用法。常用的字段型別大致可以分為數值型別 字串型別 ...
mysql密碼字段型別 MySQL欄位型別最全解析
前言 要了解乙個資料庫,我們必須了解其支援的資料型別。mysql 支援大量的字段型別,其中常用的也有很多。前面文章我們也講過 int 及 varchar 型別的用法,但一直沒有全面講過字段型別,本篇文章我們將把字段型別一網打盡,講一講常用字段型別的用法。常用的字段型別大致可以分為 數值型別 字串型別...
mysql 字段 MySQL欄位型別詳解
mysql支援大量的列型別,它可以被分為3類 數字型別 日期和時間型別以及字串 字元 型別。本節首先給出可用型別的乙個概述,並且總結每個列型別的儲存需求,然後提供每個類中的型別性質的更詳細的描述。概述有意簡化,更詳細的說明應該考慮到有關特定列型別的附加資訊,例如你能為其指定值的允許格式。由mysql...