MySQL SQL优化 - 覆盖索引(covering index)
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,CREATE TABLE `user_group` (`id` int(11) NOT NULL auto_increment,`uid` int(11) NOT NULL,`group_id` in
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
软件开发国峰软件满意
皮卡堂服务器正忙
学校网络技术招聘信息
华为服务器管理口初始密码
如何删除数据库表中的某一元组
事务性应用数据库
加强网络安全教育图片
软件开发面试项目经验怎么说
恒为服务器制造
宽带网络技术革新
漯河中等计算机网络技术
三级分销软件开发原理
计算机网络技术色域
java前端数据库
A股服务器在乌克兰
安徽通信软件开发品质保障
电脑有地址连不上服务器
无线网络技术的概念
戴尔服务器怎么启动
家用电脑有用服务器机箱的没有
软件开发应届毕业生招聘
中专计算机网络技术考什么
苹果浏览器连接到服务器的教程
高校加强网络安全防护
安徽通信软件开发品质保障
方舟生存进化怎么连接焦土服务器
特斯拉 中国 服务器
戴尔服务器授权申请
服务器 安全 360
股票交易软件开发厦门