欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

[MySQL] 用索引加速你的查询速度

程序员文章站 2022-04-17 17:54:39
...

好久没有写点东西了, 与其说是忙不如说是太懒。 先问个问题:[48,281,1,56,99,6]和[1,6,18,45,56,99,281]是两个完全一样的数组,前者是无规律可言的,后者是已经排好序的,要想把每个数组里边大于100的数找出来或者排序 那一个更快一些? 不用我说,地球人

好久没有写点东西了, 与其说是忙不如说是太懒。

先问个问题: [48,281,1,56,99,6] 和 [1,6,18,45,56,99,281] 是两个完全一样的数组,前者是无规律可言的,后者是已经排好序的,要想把每个数组里边大于100的数找出来或者排序 那一个更快一些? 不用我说,地球人除了*都知道是后者。索引就是数据表按照某一个字段或者几个字段做出排序的数据结构。

因为已经存了这些字段的排列顺序,我们就可以理解为这些数据是按照某些字段排好序的,这样取数据的时候速度就会快乐好多倍, 当数据量较少的时候索引的优势体现的并不明显, 当数据量非常大的时候,你就会发现有没有索引数据库的性能会是天壤之别。

但是索引有几个误区:

1. 索引越多越好。

好多人都说这个是错的,我看未必全错!要根据实际情况来,如果你的数据库是读写分开,在Master上写数据,在Slave上读数据, 完全可以单独在Slave上多创建几个索引 。

别的地方的解释是索引会影响数据写入的性能,还有索引多了会占用更多的硬盘空间。要想数据按照某一个或者多个字段有序地排列,系统会保存一个索引文件,多占一些硬盘空间是难免的, 另外插入记录和修改记录的时候要重新计算该记录的排序位置,并更新索引文件, 所以让insert和update 操作变慢也是肯定的。

这种想法基本上已经过时了,现在大多数的应用,尤其是数据量大到让你不得不去看一些索引优化的时候,我个人觉得你的数据库该考虑采用replication架构了,采用replication 架构的话一种提高性能非常主流又非常有效,那就是读服务器和写服务器分开。 Replication架构很好的一点就是, master 与 slave的结构可以不一样,可以采用不同的存储引擎,可以建不同的索引,他们是通过binlog来进行数据同步的, 但是主从数据库不一致是有底线的, 你必须要保证你的程序生成的sql语句在master和slave上是都可以执行的而且效果一样。 这样的话插入在master上, 我们不建索引, 读取在从服务器上我们可以多建一些索引,对数据库的插入影响还是不大的。 另外现在还计较这些硬盘空间的人完全就是扯淡!! 硬盘太便宜了,只要性能上的去, 流量上的去 还在乎这点空间吗?

2. 索引建在要查询的字段上

哥可以很负责任地告诉你, 这绝对是错的!! 我们可以分解查询操作,没有索引的时候,系统是这样执行你的 select col1, col2 from table where col3=xxxx :

系统先去查数据表table, 然后一条一条地计算 where 子句的东西 col3=xxx是否为true, 是true的话就取。索引的用途是不用再一条一条遍历了,你要查询的列已经基本有序, 采用二分法直接去查找就行了。效率节约到这里了, 跟你要查询的列屁关系没有。

当索引出现在 where 子句中有几点要注意:

1. where sin(column) > 0.5 , 当索引列作为函数参数的时候, 系统不会采用索引, 解决的办法就是换算一下,尽量不要索引列作为参数

2. where column like '%xxxx' , 通配符出现在左边的时候, 系统不会使用索引

(未完待续,待润色)

声明: 本文采用 CC BY-NC-SA 3.0 协议进行授权

转载请注明来源:小景的博客

本文链接地址:http://www.phpv5.com/blog/archives/374/