zoukankan      html  css  js  c++  java
  • mysql加索引及索引失效的情况

    前言:B+TREE索引的本质是多路绝对平衡查找树,磁盘指针,相当于书的目录,索引不是越多越好。

    一:如何加索引

    1.PRIMARY  KEY(主键索引)
            mysql>ALTER  TABLE  `table_name`  ADD  PRIMARY  KEY (  `column`  ) 
    2.UNIQUE(唯一索引)
            mysql>ALTER  TABLE  `table_name`  ADD  UNIQUE (`column` ) 
    3.INDEX(普通索引)
            mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column`  )
    4.FULLTEXT(全文索引)
            mysql>ALTER  TABLE  `table_name`  ADD  FULLTEXT ( `column` )
    5.多列索引
            mysql>ALTER  TABLE  `table_name`  ADD  INDEX index_name (  `column1`,  `column2`,  `column3`  )

    二:索引失效的情况

    1.like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。

    2.or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

    3.组合索引,不是使用第一列索引,索引失效。

    4.数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。

    5.在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。

    6.在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。

    7.对索引字段进行计算操作、字段上使用函数。

    三:EXPLAIN 查看sql执行计划(possible key:可能命中的索引;key:实际命中的索引)

    EXPLAIN select * from sr_main where mhzsfz = '330127199210021719' ; -- 0.227s
    EXPLAIN select * from sr_main where mhzsfz = '330127199210021719' and sys_scbj = 0 and sys_spzt = 1; -- 0.142s

    索引的等级:system>const>eq_ref>ref>range >index>ALL

    type为range以上才是有效索引

    select_type :查询类型

    simple简单查询 primary 主查询 UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]

    table :输出结果的表

    type:查询级别

    type=ALL 全表扫描,

    type=index 索引全扫描,遍历整个索引来查询匹配的行
    type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。
      例
        explain select * from adminlog where id>0 ,
        explain select * from adminlog where id>0 and id<=100
        explain select * from adminlog where id in (1,2)

    type=ref 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中
    type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件
    type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。
    type=NULL 不用访问表或者索引,直接就能够得到结果

    4、possible_keys : 可能使用的索引列表.

    5、key : 实现执行使用索引列表
    6、key_len : 索引的长度
    7、ref : 显示使用哪个列或常数与key一起从表中选择行。
    8、row : 执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

    四:索引建立的原则(针对b+tree数据结构,如innodb存储引擎)

    1.B+Tree数据结构为,多路绝对平衡查找树,数据存储在叶子节点(普通b-tree数据存储在磁盘块中,一个磁盘块默认大小为16kb),树结构越矮胖,查找效率越高;

    2.索引长度能少则少,因为加入分子为16kb,分母越小,树的枝干越多(矮胖原则)

    3.索引不是越多越好,越全越好,一定要建立合适的,因为索引本身也消耗资源和性能

    4.like 999%不一定命中索引(还得看索引的离散性,越是唯一越能命中,选择性越好),但是like '%999%'和‘%99999’一定不能命中索引

    5.where条件中的not in和<>无法使用索引

    6.匹配范围值,order by也可命中索引

    7.多列指定查询,少用select *

    8.联合索引(多列索引)如果不是按照索引最左列开始查找,无法使用索引。

    9.联合索引中精确匹配最左前列并范围匹配另外其他列可以用到索引

    10联合索引如果查询中有个列的范围查询,则其右边的所有列都无法使用索引。

  • 相关阅读:
    IDA 动态调试 ELF 文件
    双机调试环境搭建[win7+Windbg+VirtualKD]
    从域环境搭建到 MS14-068 提升为域权限
    栈溢出原理与 shellcode 开发
    Flask_0x05 大型程序结构
    rest-framework 框架的基本组件
    restful 规范
    Django的CBV和FBV
    Django-model 进阶
    Django-Ajax
  • 原文地址:https://www.cnblogs.com/tongcc/p/12455866.html
Copyright © 2011-2022 走看看