mysql复合索引abcac可以索引吗_MySQL联合索引

本文探讨了MySQL中复合索引的使用,强调了在查询优化中选择正确的索引的重要性。复合索引如abcac并不总是有效,查询时通常只使用索引的左侧部分。创建索引应遵循原则,例如考虑列的离散度,以提高查询效率。高离散度的列应放在索引的前面。此外,通过FORCE INDEX可以强制MySQL使用特定的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一次查询中,MySQL只能使用一个索引。

在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序、分组等。

若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影响数据写入性能。因为更新数据的同时,也要同时更新索引。

最实际的好处当然是查询速度快,性能好。

MYSQL中常用的强制性操作(例如强制索引)

https://www.jb51.net/article/49807.htm

SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …

建索引参考的原则 :

一个表有3列 ,a,b,c 说出3种索引,能够在查询的时候用到 a,b,c,bc,ac,abc .

abc (a,bc,abc)

bc (c,bc)

ca (c)

用 查询bc 的时候用不到abc和ac 索引。

使用联合索引应该注意:

MySQL使用联合索引只能使用左侧的部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c时都可以使用索引,但是当条件为b,c时将不会使用索引。这好比一本先根据姓,再根据名进行排序的电话簿,当查找的时候有姓的条件,效率会比没有任何条件高;如果在姓的基础上还有名的条件,效率会更高;但若只有名的条件,电话簿将不起作用。离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。考虑一种极端的情况,数据表中有100条记录,若INDEX(a,b)中a只有两种情况,而b有100种情况。这样对于查询唯一记录a = …,b = …时,先遍历全部索引看满足a条件的有50个索引节点,接下来还要再一个个遍历这50个索引节点。如果是INDEX(b,a),先遍历全部索引发现满足b条件的索引节点只有一个,再遍历这个节点发现也满足a条件。虽然最后都能找到那个唯一的索引节点,但是第二种索引顺序对引擎遍历索引效率有很大的提高(用电话薄的思想去思考问题)。

查看列的离散程度:select count(distinct customer_id),count(distinct staff_id) from payment;

5e5bf8a18389e0c9e8ce4ac7bb01bee9.png

customer_id列的离散程度更高,建联合索引时应该INDEX(customer_id,staff_id);

ex:

b34e83eeab10736f53932fb051ec3ab2.png

4992079def4b2a90ea16d823bf9bd498.png

1f880b10357033d977511618861732a5.png

67edc8b2769b526b4aa5d568acef57b1.png

afcb6f24b53586df41956ed998a26f1b.png

45e7eb99930996b0f6646e3c5ca0ff9a.png

13bba66f4383d0edc9045adcf0183734.png

133bda2e9b7502d7ae5a8b427aef2455.png

d518eaec05a389f3161db3f23bbef230.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值