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

    1.条件中用or,即使其中有条件带索引,也不会使用索引查询(这就是查询尽量不要用or的原因,用in吧);

    注意:使用or,又想索引生效,只能将or条件中的每个列都加上索引

    2 .对于多列索引,不是使用的第一部分,则不会使用索引。

    3.like的模糊查询以%开头,索引失效

    4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

    5.索引不存储null值

    更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本

    没Null值,不能利用到索引,只能全表扫描。为什么索引列不能存Null值?

    将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。

    这样的话,null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。

    6.不适合键值较少的列(重复数据较多的列)

    假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。

    再加上访问索引块,一共要访问大于200个的数据块。

    如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块

    少一些,肯定就不会利用索引了。

    7.,联合索引 is not null 只要在建立的索引列(不分先后)都会走,

    in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,

    其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),

    或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),

    以上两种情况索引都会走。其他情况不会走。

    介绍MySQL主要提供2种方式的索引:B-Tree索引,Hash索引

    B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。

    哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。

    显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。

    如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。

    梅花香自古寒来
  • 相关阅读:
    什么是守护线程?
    如何优雅地停止一个线程?
    如何创建、启动 Java 线程?
    什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
    并行是什么意思?与并发的区别是什么?
    并发编程的缺点?
    BZOJ_3058_四叶草魔杖_kruscal+状压DP
    BZOJ_3476_[Usaco2014 Mar]The Lazy Cow_扫描线+切比雪夫距离
    BZOJ_1511_[POI2006]OKR-Periods of Words_KMP
    BZOJ_3479_[Usaco2014 Mar]Watering the Fields_Prim
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/8625634.html
Copyright © 2011-2022 走看看