mysql倒排的優化

2021-09-20 22:07:46 字數 2764 閱讀 6319

今天資料庫負載就直線上公升,資料庫連線數撐爆。把語句抓出來一看,罪魁禍首是一條很簡單的語句: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 為關鍵字,表中記錄文件中每個字的位置資訊,查詢時掃瞄表中每個文件中字的資訊直到找出所有包含查詢關鍵字的文件。正排表結構如圖 ...