我有一个包含 3,666,058 条记录和 6 列的表,定义如下:
CREATE TABLE IF NOT EXISTS `annoyance` (
`a` varchar(50) NOT NULL default '',
`b` varchar(50) NOT NULL default '',
`c` longtext,
`d` varchar(21) NOT NULL,
`e` float default NULL,
`f` smallint(6) NOT NULL default '0',
KEY `ab` (`a`,`b`),
KEY `b` (`b`),
KEY `d` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我正在尝试获取 a
、b
和 d
列的内容,当 a
某个前缀(3个字母长),让它成为aaa
。所以我正在运行以下查询:SELECT a,b,c from annoyance where a like 'aaa%';
。这应该从表中获取大约 1,835,000 条记录。
我的问题是:这个查询非常慢(当然是在没有缓存的情况下),有时需要几分钟。
那么,我怎样才能使这个特定查询的速度更快呢?我试过但没有成功的方法是在 a
上创建索引(大小为 3 或没有指定大小):MySQL 甚至不会费心使用索引,除非我用 FORCE INDEX 强制它
(索引提示),它似乎并没有加速查询执行。
最佳答案
从 360 万行中提取 180 万行基本上需要扫描整个表。要提高性能,您无能为力。
索引无济于事。如果您要从表中获取,比如说 1000 行,那么索引可以提供帮助。并且,a
上的索引将用于like
。您也可以将其表述为:
where a >= 'aaa' and a < 'aab'
如果你想让优化器更容易选择索引。
关于MySQL:如何加速查询获取大量数据并使用 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54184614/