模型数空运最快
    1.—模糊查询:like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
    2.—数据类型不匹配:数据类型不匹配也不会走索引,比如查询字符串”1”,输入的是数字1;
    3.—函数:在查询上面使用了函数;
    4.—null :在索引列上使用 IS NULL 或 IS NOT NULL操作;
    5.—运算:对索引字段进行计算操作
    6.—最左匹配原则:没有满足最左匹配原则索引也会失效;
    7.—全表扫描:当全表扫描速度比索引速度快时,mysql会使用全表扫描;

    4.补充
    一般来说,表的索引都会建立在非空字段。
    当查询时:
    在where 语句种筛选 idx is null 时,由于索引字段不为空,所以该条件失效,无法查询;
    在where 语句种筛选 idx is not null 时,由于索引字段本身不为空,所以该条件也失效,会造成全表扫描;

    7.补充
    在innodb中,辅助索引存储的不是数据,而是主键,因此每次查询(需要回表的查询)都需要扫描两次索引,先从辅助索引中找到主键,在根据主键值从主键索引找到对应的行数据。当数据量很大时,举一个极端的例子,如果说table表中的name字段都是非空的,使用 select * from table where name is not null,这时如果走索引,每次都需要查找辅助索引,然后根据找到的主键在进行主键索引查找找到所有的行数据。但是如果走全表扫描,只需要走一遍主键索引即可得到数据,会比走两次索引更快。但是相反的如果是is null,显然走一次索引即可查到符合条件的数据,因此这时走索引更快。

    那么MySQL是怎么那么聪明的知道走索引快还是走全表扫描快的呢?难到两种方式找一遍?显然不可能。
    索引通过遍历部分数据,也就是采样,来获得预测的基数
    如果表中数据越多,符合条件的数据越少,那么走索引的优势就越大。
    反之表中数据越少,符合条件的数据越多,走全表扫描的优势越大。