什么情况下不要建索引?

    • 表的数据量很小,比如配置表
    • 列的区分度很小,比如boolean类型的列。建议可取值在5个以上再建索引(理论上可以过滤80%的数据)。
    • 经常变更的列,比如updateTime,库存,计数等。

    什么情况下建了索引用不到?

    • 逆向查询,比如!=、not in,如果是可枚举的列值,可优化为互补区间的in条件。
    • 非前缀匹配的模糊查询,比如like ‘%xx’

    优化sql的其他实践?

    • 明确只有/只需要一条数据的场景,添加limit 1可以提高效率。有唯一索引的情况下倒是无所谓。
    • 不要在sql中执行函数,比如日期的加减,计数的处理等,减少db的cpu消耗。
    • 每个索引都存在一个索引基数,也就是索引列的dv数量,索引优化器会基于该值来进行优化。

    为什么不用哈希索引?
    在某些特定业务场景下的表,建立哈希索引,比B+树索引更加有效,但是mysql把哈希索引的选择权开放给我们,而是在内部根据sql的查询特性,在索引优化器上建立哈希索引,称为自适应哈希索引。
    什么场景表适合呢,既然是哈希索引,那当然是大量kv结构获查询的场景,比如用户表,除非是用户中的运营后台有需求,否则,一般在用户表不会进行范围查询。

    什么是聚集索引和非聚集索引?