当前位置:首页 > 文章列表 > 数据库 > MySQL > Mysql索引常见问题汇总

Mysql索引常见问题汇总

来源:脚本之家 2023-01-07 12:13:50 0浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《Mysql索引常见问题汇总》,介绍一下问题、Mysql索引,希望对大家的知识积累有所帮助,助力实战开发!

Q1:数据库有哪些索引?优缺点是什么?

1.B树索引:大多数数据库采用的索引(innoDB采用的是b+树)。能够加快访问数据的速度,尤其是范围数据的查找非常快。缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,如果查询中有某个列用到了范围查询,则右边所有列都无法使用索引优化查找。

2.哈希索引:基于哈希表实现。在MySQL中,只有Memory引擎显式的支持哈希搜索。哈希查找的速度非常快,但哈希索引只包含哈希值和行指针,不存储字段值,所以不能用索引中的值来避免读取行,也不能进行排序。由于哈希索引使用的是索引列的全部内容来计算哈希值的,所以不支持部分所有列匹配查找。哈希只支持等值比较,不支持任何范围查询。一旦哈希冲突很多的话,维护成本非常高。innoDB支持“自适应哈希索引”(adaptive hash index)。

3.全文索引:全文索引是一种特殊类型的索引,它查找的是文本中的关键字,而不是比较索引的值。最初只能在MyISAM上使用,5.6.24以后innoDB也支持了全文索引。全文索引的查询要使用Match....against,在相同的列上同时创建全文搜索和基于值的B-Tree索引不会有冲突。

4.空间数据索引(R-tree索引),MyISAM支持R树索引,好处是无需前缀查询,会从所有纬度来索引数据,可以用作地理数据的存储;缺点是必须使用MySQL的GIS相关函数如MBRCONTAINS( )等来维护数据,但由于MySQL中的GIS并不完善,因此大多数人不会使用这个特性。

Q2:为什么不实用二叉查找树或者红黑树作为数据库索引。

二叉树在处理海量数据时,树的高度太高,虽然索引效率很高,达到logN,但会进行大量磁盘io,得不偿失。而且删除或者插入数据可能导致数据结构改变变成链表,需要增进平衡算法。而红黑树,插入删除元素的时候会进行频繁的变色和旋转(左旋,右旋),很浪费时间。但是当数据量很小的时候,完全可以放入红黑树中,此时红黑树的时间复杂性比b树低。因此,综上考虑,数据库最后选择了b树作为索引。

Q3:B tree和B+ tree应用场景:

1.B树常用于文件系统,和少部分数据库索引,比如mongoDB。

2.B+树主要用于mysql数据库索引。

Q4:B+ tree对比B tree的优点

B树的每个节点除了存储指向 子节点的索引外,还要存储data域,因此单一节点指向子节点的索引并不是很多,树的高度较高,磁盘io次数较多。B+树的高度更低,且所有data都存储在叶子节点,叶子节点都处于同一层,因此查询性能稳定,便于范围查找。

Q5:多列排序时使用索引的坑

A key_part specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.

根据Mysql文档的说明,创建索引的时候,可以加上asc或者desc,例如:add index idx(a asc,b desc).但是实际Mysql是会忽略的(好坑。。。)好像8.0版本之后支持desc了。

这会有什么影响呢?

假如有列test1和test2,都是int类型。

我们创建索引``idx1(test1,test2),
假如我们要按test1和test2排序,例如SQL

explain select * from table order by test1 ,test2 limit 1;

可以使用索引的排序:

  • order by test1
  • order by test1 desc
  • order by test1,test2
  • order by test1 desc,test2 desc

不可以使用索引的排序:

  • order by test1,test2,desc
  • order by test1 desc,test2

因为索引不支持desc,所以多列的索引是按全部列的升序存储的。所以只排序一列,全部列升序,全部列降序,都能用索引。但是第一列用升序,第二列用降序,或者第一列降序,第二列用升级,都不能使用索引。

理论要掌握,实操不能落!以上关于《Mysql索引常见问题汇总》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误
上一篇
关于MySQL绕过授予information_schema中对象时报ERROR 1044(4200)错误
MySQL基于group_concat()函数合并多行数据
下一篇
MySQL基于group_concat()函数合并多行数据
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    14次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    174次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    109次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    37次使用
  • Generrated:DALL·E 2/3 AI绘画提示词灵感库与图像对比平台
    Generrated
    Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
    16次使用