您的位置:首页 > 数据库 > MySQL

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

2011-08-16 23:34 363 查看
好久没有写点东西了, 与其说是忙不如说是太懒。     先问个问题: [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 [...]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: