Mysql十大經典案例 索引

2021-09-27 09:16:24 字數 3403 閱讀 7008

問題描述:使用者系統開啟緩慢,資料庫 cpu 100%

問題排查:發現資料庫中大量的慢sql,執行時間超過了2s

慢sql:

select id from `user` where user_no=13772556391 limit 0,1;
執行計畫:

*************************** 1. row ***************************

id: 1

select_type: ******

table: user

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 707250

extra: using where

mysql> select id from `user` where user_no=13772556391 limit 0,1; 

empty set (2.11 sec)

表結構:

create table `user` (

`id` int(11) unsigned not null auto_increment comment 'id',

`pid` int(11) unsigned not null default '0' ,

`email` char(60) not null ,

`name` char(32) not null default '',

`user_no` char(11) not null default '' ,

primary key (`id`),

unique key `email` (`email`),

key `pid` (`pid`)

) engine=innodb engine=innodb auto_increment=972600 default charset=utf8;

驗證mo欄位的過濾性:

mysql> select count(*) from user where user_no=13772556391;

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set (0.05 sec)

新增索引:

mysql> alter table user add index ind_user_no (user_no);

mysql>select id from `user` where user_no=13772556391 limit 0,1;

empty set (0.05 sec)

執行計畫:

mysql> explain select id from `user` where user_no=13772556391 limit 

0,1\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: user

type: index

possible_keys: ind_user_no

key: ind_user_no

key_len: 33

ref: null

rows: 707250

extra: using where; using index

為什麼索引的過濾性這麼差?

mysql> explain extended select id from`user` where user_no =13772556391 limit 0,1;

mysql> show warnings;

warning1:cannot use index 'ind_user_no ' due to type or collation conversion on field 'user_no'

note:select `user`.`id` as `id` from `user` where (`user`.`user_no` = 13772556391) limit 0,1

表結構:

create table `user` (

……`user_no` char(11) not null default '' ,

……) engine=innodb;

mysql> explain select id from `user` where user_no='13772556391' limit 0,1\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: user

type: ref

possible_keys: ind_user_no

key: ind_user_no

key_len: 33

ref: const

rows: 1

extra: using where; using index

mysql> select id from `user` where user_no='13772556391' limit 0,1;

empty set (0.00 sec)

1、通過explain檢視sql的執行計畫

判斷是否使用到了索引以及隱士轉換

2、常見的隱式轉換

包括字段資料型別型別以及字符集定義不當導致

3、設計開發階段

避免資料庫字段定義與應用程式引數定義出現不一致

不支援函式索引,避免在查詢條件加入函式:date(a.gmt_create)

4、sql審核

所有上線的sql都要經過嚴格的審核,建立合適的索引

Mysql十大經典案例 SQL優化

普通寫法 select from buyer where sellerid 100 limit 100000,5000普通limit m,n的翻頁寫法,在越往後翻頁的過程中速度越慢,原因mysql會讀取表中的 前m n條資料,m越大,效能就越差。優化寫法 select t1.from buyer t...

十大經典排序

每一次比較完就要立即交換 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。比較完所有...

佛家十大經典

佛家十大經典 經典一 一切皆為虛幻。經典二 不可說。有些話是不能說出來的。一旦失口,往往一絲脆弱的牽伴都會斷掉,縱然痛惜也 經典三 色即是空,空即是色。經典四 人生在世如身處荊棘之中,心不動,人不妄動,不動則不傷 如心動則人妄動,傷其身痛其骨,於是體會到世間諸般痛苦。經典五 一花一世界,一佛一如來。...