MySQL SQL优化 - 覆盖索引(covering index)
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,CREATE TABLE `user_group` (`id` int(11) NOT NULL auto_increment,`uid` int(11) NOT NULL,`group_id` in
千家信息网最后更新 2026年10月31日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",就表示这条查询使用了覆盖索引。
索引
查询
数据
巨大
相同
万条
业务
信息
同时
字段
性能
效果
时候
结果
缓存
需求
加索
提示
输出
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技海报
互联网新科技
华服互联网科技靠谱吗
互联网科技工作委员会
广州百单互联网科技有限公司
互联网金融监管科技数据
互联网科技深圳
互联网科技公司税收优惠
互联网科技卖菜
美国互联网科技
互联网科技作文
互联网科技公司官网
壹账通互联网科技
互联网科技股午盘股票涨跌
现代科技和互联网有关系吗
阿里巴巴算科技企业还是互联网
互联网营销推广黑科技
陕西云淼互联网科技公司
互联网风格科技公司名称
广州互联网高科技取餐柜
互联网与科技
有木互联网科技
苏州大垚互联网科技
互联网科技公司有哪些
河南猎农互联网科技有限公司
深圳艾果互联网通讯科技
互联网企业科技类企业如何做账
江苏互联网智能科技产品出厂价
兰石爱特工业互联网科技分公司
广州三三互联网科技有限公司