gpt4 book ai didi

mysql - MySQL中部分多字段索引的使用

转载 作者:行者123 更新时间:2023-11-29 00:53:59 25 4
gpt4 key购买 nike

我有一个包含近 10 亿条记录的 MyISAM 表,其中包含三个字段:a、b 和 c。

该表按顺序在 a、b 和 c 列上有一个 btree 多字段索引。分析索引表明该索引中字段的基数为:

一个:112(整数)

b: 2694 (整数)

c: 936426795(日期时间)

这意味着 a 有大约 100 个不同的值,b 有大约 20 个不同的值,对于 a 和 b 的每个组合,c 有很多值。

我想对 a 的特定值和 c 的范围执行查询。有点像

select a, b, c from mytable where a=4 and c >= "2011-01-01 00:00:00" and c < "2011-01-02 00:00:00"

获取查询解释表明它确实会使用索引,但我不知道它是否只会使用索引的第一个字段然后扫描表的其余部分,或者它是否会很聪明足以为每个 b 值应用第三个字段索引,这与执行 20 个不同的查询相同,每个查询对应一个不同的 b 值。

有知道mysql索引内部工作原理的人能回答这个问题吗?

编辑:我不是在问我是否可以让 mysql 仅在 a 和 c 上使用索引。我知道 btrees 是如何工作的,我知道你只能在 a、a 和 b,或者 a 和 b 和 c 上使用它。我想知道 mysql 优化器是否足够聪明,可以将索引应用于 b 中的所有值,以便它可以使用 a+b+c 索引,考虑到 b 的基数非常小。

考虑一个更简单的例子。一个包含两列的表:a 和 b,索引的基数在 a 上为 1,在 b 上为 10000000。 Mysql应该足够聪明,知道a只有一个值,所以这个索引相当于一个b上的索引,只在b上查询时应该使用这个索引。

最佳答案

MySQL Reference Manual :: How MySQL Uses Indexes

If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to find rows. For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3). MySQL cannot use an index if the columns do not form a leftmost prefix of the index.

a,c 不是索引 a,b,c 的最左边前缀,因此不能使用索引来解析对 c 的搜索。

关于mysql - MySQL中部分多字段索引的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com