MySQL SQL优化 - 覆盖索引(covering index)
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,CREATE TABLE `user_group` (`id` int(11) NOT NULL auto_increment,`uid` int(11) NOT NULL,`group_id` in
千家信息网最后更新 2025年01月20日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安全错误
数据库的锁怎样保障安全
网络入侵数据库技术
网络安全手抄报初一比赛
网络安全如何防护
编程制作数据库
学习网络安全工程师有要求吗
达梦数据库删除表中数据语句
湖南什么是软件开发推广
深层网络安全
如何攻击安全通服务器
creator数据库
网络技术计算机四级考试题型
网络安全导论电子书
jiaaz软件开发
部队网络安全自查自纠报告
服务器选什么电源
小马智行软件开发工程师
阿里还在用oracle数据库吗
浪潮服务器怎么配置带外
网络安全攻击方法和防御政策
大学生对网络安全背景
企业管理系统 数据库
正规软件开发价格实惠
认知偏差对网络安全的影响
边缘计算网络安全吗
杭州移动管理培训生网络技术方向
2019网络技术展望
方舟手机版服务器加载不出来
服务器常见的租赁厂商有哪些
金现代软件开发工资多少
丰台南路的网络安全公司