mysql倒排字段型別 mysql倒排的優化

2021-10-17 20:31:35 字數 2755 閱讀 4476

今天資料庫負載就直線上公升,資料庫連線數撐爆。把語句抓出來一看,罪魁禍首是一條很簡單的語句: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...