服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|

怎样正确创建MySQL索引的方法详解

2019-06-24 10:52CODETC Mysql

今天小编就为大家分享一篇关于怎样正确创建MySQL索引的方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。

什么是索引?

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。索引如图所示:

怎样正确创建MySQL索引的方法详解

最外层浅蓝色磁盘块1里有数据17、35(深蓝色)和指针P1、P2、P3(黄色)。P1指针表示小于17的磁盘块,P2是在17-35之间,P3指向大于35的磁盘块。真实数据存在于子叶节点也就是最底下的一层3、5、9、10、13……非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35。

查找过程:例如搜索28数据项,首先加载磁盘块1到内存中,发生一次I/O,用二分查找确定在P2指针。接着发现28在26和30之间,通过P2指针的地址加载磁盘块3到内存,发生第二次I/O。用同样的方式找到磁盘块8,发生第三次I/O。

真实的情况是,上面3层的B+Tree可以表示上百万的数据,上百万的数据只发生了三次I/O而不是上百万次I/O,时间提升是巨大的。

数据表索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的消耗。下面我们将简单的分析一下怎样正确创建MySQL数据索引。

怎样判断是否需要创建索引?

1、某些字段需要频繁用作查询条件时需要为它建立索引

这个应该都知道,什么样才是频繁呢?综合分析你执行的所有SQL语句。最好将他们一个个都列出来。然后分析,发现其中有些字段在大部分的SQL语句查询时候都会用到,那么就果断为他建立索引。

2、唯一性太差的字段不适合建立索引

什么是唯一性太差的字段?如状态字段、类型字段。那些只存储固定几个值的字段,例如用户登录状态、消息的status等。这个涉及到了索引扫描的特性。例如:通过索引查找键值为A和B的某些数据,通过A找到某条相符合的数据,这条数据在X页上面,然后继续扫描,又发现符合A的数据出现在了Y页上面,那么存储引擎就会丢弃X页面的数据,然后存储Y页面上的数据,一直到查找完所有对应A的数据,然后查找B字段,发现X页面上面又有对应B字段的数据,那么他就会再次扫描X页面,等于X页面就会被扫描2次甚至多次。以此类推,所以同一个数据页可能会被多次重复的读取,丢弃,在读取,这无疑给存储引擎极大地增加了IO的负担。

3、更新太频繁地字段不适合创建索引

当你为某个字段创建索引时候,如果再次更新这个字段数据时,数据库就会自动更新他的索引,所以当这个字段更新太频繁地时候那么就会不断的更新索引,性能的影响可想而知。大概被检索几十次才会更新一次的字段才比较符合建立索引的规范。而如果一个字段同一个时间段内被更新多次,那么果断不能为他建立索引。

4、不会出现在where条件中的字段不该建立索引

这个其实没什么好说的,不会用作查询条件的字段建立了索引也没用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

延伸 · 阅读

精彩推荐
  • Mysql浅谈mysql使用limit分页优化方案的实现

    浅谈mysql使用limit分页优化方案的实现

    在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。感兴趣的可以一起来了解一下如何实现优化...

    爱情小傻蛋4472019-06-12
  • MysqlMysql将一个表中的某一列数据复制到另一个表中某一列里的方法

    Mysql将一个表中的某一列数据复制到另一个表中某一列里的方法

    今天小编就为大家分享一篇关于Mysql将一个表中的某一列数据复制到另一个表中某一列里的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    CODETC2702019-06-24
  • Mysql如何批量生成MySQL不重复手机号大表实例代码

    如何批量生成MySQL不重复手机号大表实例代码

    这篇文章主要给大家介绍了关于如何批量生成MySQL不重复手机号大表的相关资料,,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    网络4762019-06-15
  • MysqlMySQL慢日志实践小结

    MySQL慢日志实践小结

    这篇文章主要介绍了MySQL慢日志实践小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    极客者1462019-06-10
  • Mysql详解mysql8.0创建用户授予权限报错解决方法

    详解mysql8.0创建用户授予权限报错解决方法

    这篇文章主要介绍了详解mysql8.0创建用户授予权限报错解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    眼沉沉1182019-06-22
  • MysqlMySQL用户账户管理和权限管理深入讲解

    MySQL用户账户管理和权限管理深入讲解

    这篇文章主要给大家介绍了关于MySQL用户账户管理和权限管理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    mumengyun1632019-06-14
  • Mysqllinux CentOS 7.4下 mysql5.7.20 密码改回来的处理方法

    linux CentOS 7.4下 mysql5.7.20 密码改回来的处理方法

    这篇文章主要介绍了linux CentOS 7.4下 mysql5.7.20 密码改回来的处理方法,需要的朋友可以参考下...

    舰_长1482019-06-17
  • MysqlMYSQL数据库服务的磁盘IO高问题分析与优化

    MYSQL数据库服务的磁盘IO高问题分析与优化

    压力测试过程中,因为资源使用瓶颈等问题引发的最直接的性能问题是业务交易响应时间偏大,TPS逐渐降低等。而问题定位分析通常情况下,最优先排查的是监控服务器资源利用率,例如先用...

    IT品课信息咨询/郭柏雅2432019-06-13