数据库优化——使用索引

来源:互联网 发布:淘宝退换货退款流程 编辑:程序博客网 时间:2024/06/05 15:27
        近期在使用数据库时终于遇到了性能问题,这在以前只是课上学些sql语句是永远不会遇到的。杂七杂八看了些东西,想着总结下,以便自己日后继续优化提高。
日常使用最多的是查找,最先想到的优化方式便是加索引,自己的理解(1)使用索引就像是给一本书加了一个目录一般,你能直接在目录中查找的东西,然后再通过目录中的页码去查找里面的内容自然会比一条一条地查看书中的记录是不是自己需要的要来的快。(2)索引没有存一些没用的列,这样同样大小可以对应更多的记录,减少磁盘调度,要知道访问磁盘的速度是很慢的。当然索引也不能乱用,毕竟索引的存储也是需要耗费存储空间的。
首先不能凭自己的主观喜欢哪列就在哪列建立索引。比较常用的索引优化主要有以下几种方式:
        (1)在选择性比较高的列上建立索引。如你在一个性别列上建立索引,而整张表就2个性别,这样既耗费了存储空间,在实际使用时也仅仅可以帮我们去除一半的记录,作用不大。建索引的列应当是经常作为条件的列,如where语句中、group by中的分组字段、order by中。 争取通过利用索引,使得需要扫描的行最少。
        (2)使用前缀索引。如果要建索引的列比较长,比如说是TEXT、BLOB、varchar比较长的字段。这样建立在这些列上的索引每条就会比较大,从而导致索引占用的空间变大,最主要是这样的索引需要的读磁盘的次数就会增加,这会非常影响读取速度。使用前缀索引就是使用一列中前面一些字符,而不是整个字段值都用上,这实际上是在选择性跟存储空间上作了一定的折中。摘个建前缀索引的例子:ALTER TABLE city_demo ADD KEY (city(7));(摘自《高性能mysql》)。
        (3)使用单独的列,不要让索引字段出现在表达式或函数中。如id是索引字段,不要使用where id+1=2而应使用where id =1。
        (4)使用多列索引。原来一直的做法都是在单独的列上建立索引,没尝试过建立多列索引。今天读《高性能mysql》看了个栗子,WHERE actor_id=1 OR film_id=1,这种写法如果分别在actor_id,film_id上建立索引在老的mysql中则会进行全表扫描,而不能充分利用索引的优点,比较好的做法便是在这两个字段上建立联合索引,使用联合索引时要注意最左前缀原则。如在col1,col2,col3上建立多列索引,使用时col2,col3或是col3都是不能用上多列索引的。
        (5)建立多列索引时注意最左前缀原则。mysql在创建索引时会按照索引的声明顺序进行排序,一般将选择性比较高的列放在左边。
        (6)使用覆盖索引。如果可以直接在索引中查到自己所需的所有内容,而无需再回表查询,效率便会高很多。使用覆盖索引时,通过EXPLAIN可以看到extra列为using index。注意和type列的index相区别,index表示的是通过索引进行全表扫描,如果此时没有做到覆盖索引,那么便需要回表查询内容,这便成为了随机IO,效率便比全表扫描还会低。

        (7)使用索引进行排序,要注意最左前缀原则,在使用join时,order by的都要是第一张表的字段;where中有左边前缀的常量,order by中其他正常顺序也可以使用索引进行排序。

        (8)合理地使用聚簇索引。聚簇索引描述了一种存储格式,数据的存储顺序与聚簇索引的存储顺序相同。这样在进行IO密集型操作时,比如取出一个id对应的所有邮件,如在id上使用聚簇索引,便可以将其所有邮件一块取出,从而减少IO次数,从而提高效率。如无需要聚集的列,可以选用AUTO_IMCREMENT列建立聚簇索引,这样可以减少插入数据时B+树索引的分裂。另附一张《高性能mysql》中的图片,感觉真的很不错:


        先总结这么多,以上都是读了《高性能mysql》后自己的想法,可能有许多理解不当的地方,还望大神们看到不当的地方能麻烦指出,能帮我去更好地去理解,大家共同探讨进步。

原创粉丝点击