zoukankan      html  css  js  c++  java
  • 数据查询优化之mysql索引

    为什么要建立索引:

    索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。而如果采取索引,则可以根据索引指向的页以及记录在页中的位置,迅速地读取目标页进而获取目标记录。

    使用索引需要注意:

    ⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销;

    ⑵组合索引支持前缀索引;

    ⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本

     索引的字段类型问题

    • text类型,也可建索引(需指定长度)
    • myisam存储引擎索引键长度综合不能超过1000字节
    • 用来筛选的值尽量保持和索引列同样的数据类型

    索引分四类:

    index ----普通的索引,数据可以重复

    fulltext----全文索引,用来对大表的文本域(char,varchar,text)进行索引。语法和普通索引一样。 

    unique ----唯一索引,唯一索引,要求所有记录都唯一

    primary key ----主键索引,也就是在唯一索引的基础上相应的列必须为主键

    like 不能用索引?

    • 尽量减少like,但不是绝对不可用,”xxxx%” 是可以用到索引的,

    想象一下,你在看一本成语词典,目录是按成语拼音顺序建立,查询需求是,你想找以 “一”字开头的成语(”一%“),和你想找包含一字的成语(“%一%”)

    • 除了like,以下操作符也可用到索引:

    <,<=,=,>,>=,BETWEEN,IN

    <>,not in ,!=则不行

    原则

    1. 单表数据太少,索引反而会影响速度;更新非常频繁的数据不适宜建索引
    2. where后的条件,order by ,group by 等这样过滤时,后面的字段最好加上索引。根据实际情况,选择PRIMARY KEY、UNIQUE、INDEX等索引,但是不是越多越好,要适度
    3. 联合查询,子查询等多表操作时关连字段要加索引

    ps:数据量特别大的时候,最好不要用联合查询,即使你做了索引(??)

    索引原则

    1.索引越少越好
       原因:主要在修改数据时,第个索引都要进行更新,降低写速度。
    2.最窄的字段放在键的左边
    3.避免file sort排序,临时表和表扫描.

    哪些常见情况不能用索引?

      • like “%xxx”
      • not in , !=
      • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
      • WHERE index=1 OR A=10
      • 存了数值的字符串类型字段(如手机号),查询时记得不要丢掉值的引号,否则无法用到该字段相关索引,反之则没关系

    覆盖索引(Covering Indexes)拥有更高效率

    索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *

    NULL 的问题

    NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?)

    如何查看索引信息,如何分析是否正确用到索引?

    show index from tablename;
    explain select ……;

    天道酬勤
  • 相关阅读:
    「BZOJ 1000」A+B Problem
    「HNOI 2008」越狱
    蓝桥杯 拼音字母
    蓝桥杯 抽签
    蓝桥杯 快速排序
    [蓝桥杯] 最大比例
    [蓝桥杯] 交换瓶子
    [蓝桥杯] 四平方和
    [蓝桥杯] 剪邮票
    [蓝桥杯] 方格填数
  • 原文地址:https://www.cnblogs.com/luohero/p/7390845.html
Copyright © 2011-2022 走看看