Java教程:MySQL如何设计索引更高效?(五)

开课吧开课吧锤锤2021-03-05 11:29

点赞
有用
分享分享

    Java编程语言是一种简单、面向对象、分布式、解释型、健壮安全、与系统无关、可移植、高性能、多线程和动态的语言。如今Java已经广泛应用于各个领域的编程开发。

Java

    跳跃索引

    一般情况下,如果表users有复合索引idx_status_create_time,我们都知道,单独用create_time去查询,MySQL优化器是不走索引,所以还需要再创建一个单列索引idx_create_time。用过Oracle的同学都知道,是可以走索引跳跃扫描(IndexSkipScan),在MySQL8.0也实现Oracle类似的索引跳跃扫描,在优化器选项也可以看到skip_scan=on。

    |optimizer_switch|use_invisible_indexes=off,skip_scan=on,hash_join=on|

 

    适合复合索引前导列唯一值少,后导列唯一值多的情况,如果前导列唯一值变多了,则MySQLCBO不会选择索引跳跃扫描,取决于索引列的数据分表情况。

    mysql>explainselectid,user_id,status,phonefromuserswherecreate_time>=

'2021-01-0223:01:00'andcreate_time<='2021-01-0323:01:00';

    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----

    |id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra|

    +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+----

    |1|SIMPLE|users|NULL|range|idx_status_create_time|idx_status_create_time

|NULL|NULL|15636|11.11|Usingwhere;Usingindexforskipscan|

    也可以通过optimizer_switch='skip_scan=off'来关闭索引跳跃扫描特性。

    总结

    本位为大家介绍了MySQL中的索引,包括聚集索引和辅助索引,辅助索引包含了主键id用于回表操作,同时利用覆盖索引扫描可以更好的优化SQL。

    同时也介绍了如何更好做MySQL索引设计,包括前缀索引,复合索引的顺序问题以及MySQL8.0推出的索引跳跃扫描,我们都知道,索引可以加快数据的检索,减少IO开销,会占用磁盘空间,是一种用空间换时间的优化手段,同时更新操作会导致索引频繁的合并分裂,影响索引性能,在实际的业务开发中,如何根据业务场景去设计合适的索引是非常重要的,今天就聊这么多,希望对大家有所帮助。

    以上内容由开课吧老师敖丙提供,更多Java教程尽在开课吧广场Java教程频道。

有用
分享