
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教程频道。
