gpt4 book ai didi

Mysql不在大表上使用索引

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

我有下一张 table :

CREATE TABLE `test` (
`fingerprint` varchar(80) COLLATE utf8_unicode_ci NOT NULL,
`country` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
`loader` int(10) unsigned NOT NULL,
`date` date NOT NULL,
`installer` int(10) unsigned DEFAULT NULL,
`browser` varchar(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`version` varchar(5) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`os` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`language` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`fingerprint`, `date`),
KEY `date_1` (`date`),
KEY `date_2` (`date`,`loader`,`installer`,`country`,`browser`,`os`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

目前它包含 1000 万条记录,并且每天将增加 200 万条记录。

我的问题,为什么 MySQL 在下一个查询中使用“Using Where”:

explain select count(*) from test where date between '2013-08-01' and '2013-08-10'
1 SIMPLE test range date_1,date_2 date_1 3 1601644 Using where; Using index

更新,为什么下一个问题有类型 - All 和 Using where then:

explain select * from test use key(date_1) where date between '2013-08-01' and '2013-08-10'
1 SIMPLE test ALL date_1 null null null 3648813 Using where

最佳答案

确实使用索引。

它就在那里说:Using where;使用索引。 “使用哪里”并不意味着完全扫描,它意味着它正在使用您提供的 WHERE 条件。

1601644 数字也暗示了这一点:这意味着它预计读取大约 160 万条记录,而不是表中的全部 1000 万条记录,并且它与您估计的 ~200 万条/天相关。

简而言之,它似乎做得很好,只是您将检索很多数据。

仍然,它也在读取表数据,当索引看起来应该足够时。尝试将 count(*) 更改为 count(date),因此 date 是整个查询中唯一提到的字段。如果你只得到 Using index,那么它可能会更快。

关于Mysql不在大表上使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18104557/

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