gpt4 book ai didi

未使用 MySQL 复合索引

转载 作者:可可西里 更新时间:2023-11-01 06:45:21 24 4
gpt4 key购买 nike

我有一个大表,我必须从中选择大量行。

该表存储调用详细记录 (CDR)。示例:

+-------------+--------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------------------+----------------+
| id | int(45) | NO | PRI | NULL | auto_increment |
| calldate | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| accountcode | varchar(100) | NO | | | |
| other... | varchar(45) | NO | | | |

由于我的查询查找的是特定日期的客户来电,因此我在一个聚集索引中将调用日期和帐户代码编入索引,如下所示:

CREATE TABLE `cdr` (
`id` int(45) NOT NULL AUTO_INCREMENT,
`calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`accountcode` varchar(100) NOT NULL DEFAULT '',
other fields...
PRIMARY KEY (`id`),
KEY `date_acc` (`calldate`,`accountcode`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=latin1

但是,当执行以下查询时,EXPLAIN 结果显示仅使用了键的日期时间部分:

查询:

SELECT * 
FROM cdr
WHERE calldate > '2010-12-01'
AND accountcode = 'xxxxxx';

解释结果:

+----+-------------+-------+-------+---------------+----------+---------+------+---------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+---------+----------+-------------+
| 1 | SIMPLE | cdr | range | date_acc | date_acc | 8 | NULL | 3312740 | 100.00 | Using where |
+----+-------------+-------+-------+---------------+----------+---------+------+---------+----------+-------------+

似乎只使用了前 8 个字节( key 的日期部分)。但是,WHERE 子句使用 AND 显式引用 key 的两个部分,因此理论上应该使用完整的 key 。

我应该为 calldate 和 accountcode 创建单独的索引并让查询优化器合并它们吗?为什么没有使用完整索引?

感谢您的帮助!

最佳答案

简短回答:如果您的 key 是 (accountcode, calldate) 而不是 (calldate, accountcode),您将能够在此处更有效地使用索引。

理解该问题的最佳方法是将多列键视为不同列的串联。例如,如果第 1 列的值为“A、B、C、D”,第 2 列的值为“W、X、Y、Z”,您将在“A-W、B-X、C-Y、D-Z”等上构建一个索引,并将所有将这些转化为 B 树。

要进行范围查询,您会找到范围低端的第一个后继者,然后迭代直到超出范围上限。这意味着您只能有效地使用索引对键的后缀进行范围查询。

关于未使用 MySQL 复合索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599301/

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