前端时间跟一个DB相关的项目,alanc反馈有一个查询,使用索引比不使用索引慢很多倍,有点毁三观。所以跟进了一下,用explain,看了看2个查询不同的结果。
不用索引的查询的时候结果如下,实际查询中速度比较块。
复制代码 代码如下:
mysql> explain select * from rosterusers limit 10000,3 ;
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+
| 1 | SIMPLE | rosterusers | ALL | NULL | NULL | NULL | NULL | 2010066 | |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------+
而使用索引order by的查询结果如下,速度反而慢的惊人。
mysql> explain select * from rosterusers order by username limit 10000,3 ;
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+
| 1 | SIMPLE | rosterusers | ALL | NULL | NULL | NULL | NULL | 2010087 | Using filesort |
+----+-------------+-------------+------+---------------+------+---------+------+---------+----------------+
区别在于,使用索引查询的Extra变成了,Using filesort。居然用了使用外部文件进行排序。这个当然慢了。
但数据表上在username,的确是有索引的。怎么会反而要Using filesort?
看了一下数据表定义。是一个开源聊天服务器ejabberd的一张表。初看以为主键i_rosteru_user_jid是username,和jid的联合索引,那么使用order by username时应该是可以使用到索引才对呀?
复制代码 代码如下:
CREATE TABLE `rosterusers` (
`username` varchar(250) NOT NULL,
`jid` varchar(250) NOT NULL,
UNIQUE KEY `i_rosteru_user_jid` (`username`(75),`jid`(75)),
KEY `i_rosteru_jid` (`jid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
仔细检查突然发现其主键定义,不是定义的完整的主键名称,而跟了一个75的长度描述,稍稍一愣,原来用的是前缀索引,而不是整个字段都是索引。(我的记忆里面InnoDB还不支持这玩意,估计是4.0后什么版本加入的),前缀索引就是将数据字段中前面N个字节作为索引的一种方式。
发现了这个问题后,我们开始怀疑慢查询和这个索引有关,前缀索引的主要用途在于有时字段过程,而MySQL支持的很多索引长度是有限制的。
首先不带order by 的limit 这种查询,本质可能还是和主键相关的,因为MySQL 的INNODB的操作实际都是依靠主键的(即使你没有建立,系统也会有一个默认的),而limit这种查询,使用主键是可以加快速度,(explain返回的rows 应该是一个参考值),虽然我没有看见什么文档明确的说明过这个问题,但从不带order by 的limit 查询的返回结果基本可以证明这点。
但当我们使用order by username的时候,由于希望使用的是username的排序,而不是username(75)的排序,但实际索引是前缀索引,不是完整字段的索引。所以反而导致了order by的时候完全无法利用索引了。(我在SQL语句里面增加强制使用索引i_rosteru_user_jid也不起作用)。而其实使用中,表中的字段username 连75个都用不到,何况定义的250的长度。完全是自己折腾导致的麻烦。由于这是其他产品的表格,我们无法更改,暂时只能先将就用不不带排序的查询讲究。
总结:
•前缀索引,并不是一个万能药,他的确可以帮助我们对一个写过长的字段上建立索引。但也会导致排序(order by ,group by)查询上都是无法使用前缀索引的。
•任何时候,对于DB Schema定义,合理的规划自己的字段长度,字段类型都是首要的事情。
相关推荐:
SEO观看:如何通过优化提升您的网站流量和品牌影响力,龙里网络营销推广
SEO策划:让你的网站迅速脱颖而出的秘诀,seo优化和技巧
ChatGPT页面空白无法登录?如何解决这一困扰?,温州ai字幕生成
seo诊断什么意思,seo诊断a5 ,约瑟夫ai
360刷排名工具选哪家?揭秘2025年最强排名优化工具!,ai写作网站哪个好一点
互联网快照:记录数字时代的每个瞬间,全网seo怎么优化内容
seo矩阵运营中心是什么,seo矩阵运营中心是什么意思啊 ,北京ai特效
SEO模块:提升网站排名,驾驭数字营销未来,营口网站建设制作平台
SEO差价如何用SEO优化帮助企业实现成本与效益的完美平衡,盐城seo收费贵吗
SEO分类:从基础到进阶,全面解析SEO优化的关键要素,新建设网站排名
SEO优化:让你的网站在竞争中脱颖而出,临沧seo代理
如何选择适合你的AI工具?全面解析AI工具哪个好用
SEO新人必读:从零开始SEO的核心技巧与实践指南,网站邮件推广设计
文章AI生成标题:让创作更轻松,内容更精彩
AI热门软件,未来科技的钥匙
乘风SEO-引领企业互联网时代的腾飞之路,南昌b站关键词排名优化贵不贵
seo类文章是什么,seo技术文章 ,ai3.5-ai聊天
如何通过AI写文章,轻松提高写作效率与质量
SEO深度解析:如何通过深度优化提升网站排名,带来流量和转化,咸宁网站建设大概费用
SEO特点与实施策略:提升网站流量与排名的关键,定西抖音seo价格查询
乘风SEO:突破困境,领航网络营销新时代,武汉靠谱的关键词排名
为什么选择SEO会员服务,让您的网站流量飞速增长,靖边专业网站建设公司
文章创作AI:引领智能写作的新时代
什么是seo概念,什么是seo,sem ,ai音标谐音
SEO优化基础:让你的网站脱颖而出的秘密武器,模仿猫ai
OpenAIGPT:开启智能时代的语言革命,ai辣妹动漫
AI写作的崛起-“只能AI写作”背后的巨大潜力,舞狮摄影ai
SEO指:如何通过精准优化提高网站流量和转化率,无锡论坛营销推广要多久
自动写文章的AI,提升效率的创作利器
为什么做抖音seo,为什么做抖音推广 ,描边ai虚线
OpenArtAI如何进入:数字艺术的未来之门,分析海报ai
什么是seo行业,seo是什么职业做什么的 ,ai标题字体效果
中外链:打通全球流量的桥梁,提升网站排名与流量的双重保障,行业网站建设思路
SEO优化10种策略:提升网站排名的有效方法,帅气ai男头白底
seo都有什么问题,seo都有什么问题和答案 ,ai凯旋公主下载
WPJVX:开启数字化未来的智慧平台,关键词排名技术咨询乐云seo
亚马逊中什么是seo,亚马逊sop ,ai临摹中国名画
ChatGPT免费版每天提问有次数限制吗?揭秘如何高效使用AI助手!,机甲ai手绘
ChatGPT服务器坏了?了解背后的技术与应对策略,AI模块代表
SEO详解:如何优化你的网站提升排名,获得更多流量,伊春湖南网站优化推广
《SEO教材:打造网站流量的核心利器,教你轻松SEO优化技巧》,咖啡网站建设总结文案
AI通过算法和数据生成的作品:科技与艺术的跨越,带来无限创意可能,ai优化程序
ChatGPT+维护页面:您的智能助手之旅,安全、高效、无忧,奥特曼画图ai
SEO调整,助力网站流量爆发式增长!,江都seo优化排名
ChatGPT维护-智能时代的数字助手,如何让你的工作更高效,ai智能救援
seo网络推广是什么,seo网络推广是什么意思 ,ai哪里注音
AI缩写文档:革新文档管理与自动化的未来,ai聊天中文
GPT-3.5网页版:让你与人工智能零距离接触,ai英语学
未来写作新方式原创AI文章的无限可能
seo进阶买什么书推广,seo的推广技巧 ,菩萨壁纸ai