我有一个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
强制使用(索引提示),它似乎并没有加快查询的执行速度。
答案 0 :(得分:3)
要从360万行中提取180万行,基本上需要扫描整个表。您不能做很多事情来提高性能。
索引将无济于事。如果要从表中获取1000行,则索引可以提供帮助。并且,a
上将使用like
上的索引。您也可以这样写:
where a >= 'aaa' and a < 'aab'
如果您想使优化程序更容易选择索引。
答案 1 :(得分:0)
您是否尝试过LEFT() 根据此测试,它比LIKE更快。 http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-charindex
SELECT a,b,c from annoyance where LEFT(a,3) = 'aaa'
答案 2 :(得分:0)
INDEX(a, b, d)
(或(a, d, b)
)的运行速度更快,因为它是“覆盖”索引。
(如果d
确实是您要获取的内容,请将c
更改为c
。)