gpt4 book ai didi

mysql - 实现复合索引

转载 作者:行者123 更新时间:2023-12-01 00:20:01 25 4
gpt4 key购买 nike

我一直在阅读有关复合索引如何提高性能的文章,但我对一些事情仍然不清楚。我有一个 INNODB 数据库,其中包含超过 2000 万个条目,每个条目有 8 个数据点。其业绩在过去几个月大幅下滑。服务器有 6 个内核和 4gb 内存,很快就会增加,但服务器上没有迹象表明我的内存不足。 my.cnf 中的 INNODB 设置已更改为;

innodb_buffer_pool_size = 1000M
innodb_log_file_size = 147M

这些设置在过去很有帮助。因此,我的理解是许多因素都会导致性能下降,包括我最初根本没有索引这一事实。索引方法基于运行的查询类型。所以,这是我的 table ;

cdr_records | CREATE TABLE `cdr_records` (
`dateTimeOrigination` int(11) DEFAULT NULL,
`callingPartyNumber` varchar(50) DEFAULT NULL,
`originalCalledPartyNumber` varchar(50) DEFAULT NULL,
`finalCalledPartyNumber` varchar(50) DEFAULT NULL,
`pkid` varchar(50) NOT NULL DEFAULT '',
`duration` int(11) DEFAULT NULL,
`destDeviceName` varchar(50) DEFAULT NULL,
PRIMARY KEY (`pkid`),
KEY `dateTimeOrigination` (`dateTimeOrigination`),
KEY `callingPartyNumber` (`callingPartyNumber`),
KEY `originalCalledPartyNumber` (`originalCalledPartyNumber`),
KEY `finalCalledPartyNumber` (`finalCalledPartyNumber`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

因此,通常情况下,查询将采用一个值并搜索 callingPartyNumber、originalCalledPartyNumber 和 finalCalledPartyNumber 以在表中查找与其相关的任何条目。因此,像我上面说明的那样使用单独的索引没有任何意义,因为我通常不运行这样的查询。但是,我在晚上还有另一份工作,基本上是;

select * from cdr_records;

在这种情况下,拥有另一个包含所有列的复合索引听起来是个好主意。我的理解正确吗?

最佳答案

当您需要以相同的方式基于多个列进行选择/排序/分组时,复合索引的好处就来了。

我记得我在某处读到过一个很好的电话簿类比例子。由于电话簿中的名字是按字母顺序排列的,因此您可以很容易地对它们进行排序,并根据名字的字母从左到右找到您需要的名字。你可以想象这是名字中字母的复合索引。

如果名称仅按首字母排序,而后面的字母是困惑的(单列索引),您将不得不在找到首字母后遍历所有记录,这将花费很多时间。

使用复合索引,你可以从左到右开始,很容易找到你要找的记录,这也是为什么你不能使用例如复合索引的第二列或第三列的原因,因为你需要以前的才能让它工作。想象一下,试图在电话簿中查找第三个字母为“a”的所有姓名,这将是一场噩梦,为此您需要一个单独的索引,如果您需要使用来自一个复合索引,不使用它之前的索引中的其他列。

请记住,电话簿示例假定姓名的每个字母都是一个单独的列,这可能有点令人困惑。

复合索引的另一个强大优势是唯一复合索引,它允许您对数据应用更高的逻辑限制,这在您需要时非常方便。与性能无关,但我认为值得一提。

在你的问题中,你的sql没有条件,所以不会使用索引。始终建议使用 EXPLAIN 来查看发生了什么,您永远无法确定!

关于mysql - 实现复合索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670924/

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