MySQL SQL優化 - 覆蓋索引(covering index)
CREATE TABLE `user_group` (
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`),
) ENGINE=InnoDB AUTO_INCREMENT=750366 DEFAULT CHARSET=utf8
看AUTO_INCREMENT就知道資料並不多,75萬條。簡單的查詢:
SELECT SQL_NO_CACHE uid FROM user_group WHERE group_id = 245;
-- SQL_NO_CACHE 不使用快取提示
Explain的結果是:
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
| 1 | SIMPLE | user_group | ref | group_id | group_id | 4 | const | 5544 | |
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
看起來已經用上索引了,資料分佈上,group_id相同的比較多,uid雜湊的比較均勻,加索引的效果一般,試著加了一個多列索引:
ALTER TABLE user_group ADD INDEX group_id_uid (group_id, uid);
這句SQL查詢的效能發生了巨大的提升,居然已經可以跑到0.00s左右了。經過優化的SQL再結合真實的業務需求,也從之前2.2s下降到0.05s。
再Explain一次
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
| 1 | SIMPLE | user_group | ref | group_id,group_id_uid | group_id_uid | 4 | const | 5378 | Using index |
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
這種叫覆蓋索引(covering index),MySQL只需要通過索引就可以返回查詢所需要的資料,而不必在查到索引之後再去查詢資料,所以相當快!!但是同時也要求所查詢的欄位必須被索引所覆蓋到,在Explain的時候,輸出的Extra資訊中如果有“Using Index”,就表示這條查詢使用了覆蓋索引。
`id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `group_id` (`group_id`),
) ENGINE=InnoDB AUTO_INCREMENT=750366 DEFAULT CHARSET=utf8
看AUTO_INCREMENT就知道資料並不多,75萬條。簡單的查詢:
SELECT SQL_NO_CACHE uid FROM user_group WHERE group_id = 245;
-- SQL_NO_CACHE 不使用快取提示
Explain的結果是:
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
| 1 | SIMPLE | user_group | ref | group_id | group_id | 4 | const | 5544 | |
+----+-------------+------------+------+---------------+----------+---------+-------+------+-------+
看起來已經用上索引了,資料分佈上,group_id相同的比較多,uid雜湊的比較均勻,加索引的效果一般,試著加了一個多列索引:
ALTER TABLE user_group ADD INDEX group_id_uid (group_id, uid);
這句SQL查詢的效能發生了巨大的提升,居然已經可以跑到0.00s左右了。經過優化的SQL再結合真實的業務需求,也從之前2.2s下降到0.05s。
再Explain一次
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
| 1 | SIMPLE | user_group | ref | group_id,group_id_uid | group_id_uid | 4 | const | 5378 | Using index |
+----+-------------+------------+------+-----------------------+--------------+---------+-------+------+-------------+
這種叫覆蓋索引(covering index),MySQL只需要通過索引就可以返回查詢所需要的資料,而不必在查到索引之後再去查詢資料,所以相當快!!但是同時也要求所查詢的欄位必須被索引所覆蓋到,在Explain的時候,輸出的Extra資訊中如果有“Using Index”,就表示這條查詢使用了覆蓋索引。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-2055391/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL SQL最佳化 - 覆蓋索引(covering index)MySql索引Index
- MySQL SQL 優化之覆蓋索引MySql優化索引
- mysql索引覆蓋掃描優化MySql索引優化
- 【MySQL】效能優化之 覆蓋索引MySql優化索引
- MySQL優化之覆蓋索引的使用MySql優化索引
- 【MySQL】三、效能優化之 覆蓋索引MySql優化索引
- Mysql索引覆蓋MySql索引
- mysql的Covering IndexMySqlIndex
- 【MySQL】效能最佳化之 覆蓋索引MySql索引
- MySQL 聚簇索引 和覆蓋索引MySql索引
- MySQL 的覆蓋索引與回表MySql索引
- MySQL 覆蓋索引、回表查詢MySql索引
- 技術分享 | MySQL 覆蓋索引最佳化案例一則MySql索引
- mysql覆蓋索引高效能的探究MySql索引
- MySQL-覆蓋索引總結筆記MySql索引筆記
- mysql覆蓋索引之看山還是山MySql索引
- 索引優化index skip scan索引優化Index
- MySQL 優化之 index_merge (索引合併)MySql優化Index索引
- 【離散優化】覆蓋問題優化
- SQL優化-索引SQL優化索引
- mysql 索引( mysql index )MySql索引Index
- MySQL索引優化MySql索引優化
- mysql優化索引MySql優化索引
- 【SQL優化】LIKE vs INDEXSQL優化Index
- 《MySQL慢查詢優化》之SQL語句及索引優化MySql優化索引
- 還傻傻分不清MySQL回表查詢與索引覆蓋?MySql索引
- MySQL索引和SQL調優MySql索引
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- MySQL 效能優化之索引優化MySql優化索引
- Mysql索引優化(一)MySql索引優化
- MySQL 5.7 索引優化MySql索引優化
- Mysql——index(索引)使用MySqlIndex索引
- MySQL調優之索引優化MySql索引優化
- 聊聊索引和SQL優化索引SQL優化
- SQL優化--函式索引SQL優化函式索引
- MySQL 字串索引優化方案MySql字串索引優化
- MySQL 索引原理以及優化MySql索引優化
- mysql索引原理及優化MySql索引優化