MySQL -- 联合索引 使用原则

最左前缀法则是数据库索引使用的关键原则,尤其是在多列联合索引中。当查询从索引的最左边开始并连续包含所有列时,索引效果最佳。如果跳过任何列,后续列的索引将不会被使用。范围查询如使用>或<会使右侧列索引失效,但使用>=,<=则可利用完整索引。因此,为了优化查询,应尽量避免使用不连续列和非包容性范围查询。

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效(后面的字段索引失效)

比如在一个 tb_user 表中,有一个联合索引,这个联合索引涉及到三个字段,顺序分别为:profession,agestatus

对于最左前缀法则指的是,查询时,最左变的列,也就是profession必须存在,否则索引全部失效。 如下

select * from tb_user where age = 21 and status = '0';

但是查询时,如果跳过了age这个列,后面的列索引是不会使用的,也就是索引部分生效,如下 

select * from tb_user where profession = '软件工程' and status = '0';

范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。 

select * from tb_user where profession = '软件工程' and age > 30 and status = '0';

范围查询使用> < 时,是会走联合索引,但是像上面这种情况,范围查询右边的status字段是没有走索引的

规避方法: 

但是如果使用 >= 或 <= 时,所有的字段都是走索引的。如下

select * from tb_user where profession = '软件工程' and age >= 30 and status = '0';
所以,在业务允许的情况下,尽可能的使用类似于 >= <= 这类的范围查询,而避免使用 >
Mysql联合索引是提升数据库查询优化操作和性能的重要手段,以下是一些使用方法: - **创建联合索引**:可以使用`CREATE INDEX`语句创建联合索引。例如创建一个名为`idx_order`的联合索引,涉及`col1`和`col2`两列: ```sql CREATE INDEX idx_order ON table_name (col1, col2); ``` 也可以在创建表时直接定义联合索引。以下示例在创建`test`表时,为`last_name`和`first_name`两列创建了名为`name`的联合索引: ```sql CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) ); ``` - **查询时使用联合索引**:在查询时,要注意联合索引的最左前缀原则,即查询条件要从联合索引的最左边列开始,并且不能跳过列。例如,对于上述`idx_order`联合索引,以下查询可以使用索引: ```sql SELECT * FROM table_name WHERE col1 = 'value1' AND col2 = 'value2'; ``` - **排序时使用联合索引**:如果查询中包含`ORDER BY`子句,且排序的列与联合索引的列顺序一致,也可以使用联合索引来提高排序性能。例如: ```sql SELECT * FROM table_name ORDER BY col1, col2; ``` - **索引使用注意事项**:避免在索引列上使用函数或计算,否则可能导致索引失效。例如以下查询可能无法使用联合索引: ```sql SELECT * FROM table_name WHERE col1 + 1 = 10; ``` - **不同数据类型的索引使用情况**:对于联合索引,如果B字段使用大于条件,不同数据类型的索引使用情况不同。如果是数字类型,通常会走索引;如果是普通的字符串类型(varchar),MySQL内部会判断,如果走索引查询效率并没有明显提升,就不会使用索引 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值