当前位置: 首页 > 编程笔记 >

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

夏谦
2023-03-14
本文向大家介绍怎样正确创建MySQL索引的方法详解,包括了怎样正确创建MySQL索引的方法详解的使用技巧和注意事项,需要的朋友参考一下

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

什么是索引?

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

最外层浅蓝色磁盘块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索引类型以及创建,包括了详解mysql索引总结----mysql索引类型以及创建的使用技巧和注意事项,需要的朋友参考一下 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十

  • 主要内容:基本语法,创建普通索引,创建唯一索引创建索引是指在某个表的一列或多列上建立一个索引,可以提高对表的访问速度。创建索引对 MySQL 数据库的高效运行来说是很重要的。 基本语法 MySQL 提供了三种创建索引的方法: 1) 使用 CREATE INDEX 语句 可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。 语法格式: CREATE <索引名> ON <表名> (<列名> [

  • 本文向大家介绍MySQL查看、创建和删除索引的方法,包括了MySQL查看、创建和删除索引的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MySQL查看、创建和删除索引的方法。分享给大家供大家参考。具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快

  • 本文向大家介绍Mysql之组合索引方法详解,包括了Mysql之组合索引方法详解的使用技巧和注意事项,需要的朋友参考一下 对于任何DBMS,索引都是进行优化的最主要的因素。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降。  如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:  假设存在组合索引(c1,c2),

  • 问题内容: 我有下表: 除非有人提出一些疯狂的新无麸质饮食来席卷全国,否则大多数情况下,每一行都将被设置为。 我需要能够非常快速地查询该值为true的行。我创建了索引: 它似乎可以工作,但是我不知道如何确定是否仅索引值为true的行。我想确保它不会像在索引任何具有任何值的行时那样愚蠢。 我应该在子句中添加运算符,还是此语法完全有效?希望这不是那些将被否决30次的超级简单的RTFM问题之一。 更新:

  • 问题内容: 我不了解pymongo和pymongo之间的区别。在MongoDB索引页面上,它说 您可以通过调用 但是在pymongo中,有两个不同的命令和,创建索引的文档包括: 与create_index()尝试无条件创建索引的方法不同,sure_index()利用驱动程序中的某些缓存,以便仅尝试创建可能不存在的索引。当PyMongo创建(或确保)索引时,将在ttl秒内“记住”该索引。在此期限内重