問題描述:使用者系統開啟緩慢,資料庫 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...
十大經典排序
每一次比較完就要立即交換 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。比較完所有...
佛家十大經典
佛家十大經典 經典一 一切皆為虛幻。經典二 不可說。有些話是不能說出來的。一旦失口,往往一絲脆弱的牽伴都會斷掉,縱然痛惜也 經典三 色即是空,空即是色。經典四 人生在世如身處荊棘之中,心不動,人不妄動,不動則不傷 如心動則人妄動,傷其身痛其骨,於是體會到世間諸般痛苦。經典五 一花一世界,一佛一如來。...