MySQL:如何加快获取大量数据并使用LIKE

时间:2019-01-14 15:41:05

标签: mysql sql indexing

我有一个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;

我尝试获取abd列的内容,当a以某个前缀(长3个字母)开头时, aaa。因此,我正在运行以下查询:SELECT a,b,c from annoyance where a like 'aaa%';。这将从表中获取约1,835,000条记录。

我的问题是:此查询非常慢(当然,当不缓存时),有时最多需要几分钟。

那么,如何使该特定查询的运行速度更快?我尝试过但没有成功的其他事情是在a(大小3或未指定大小)上创建索引:MySQL甚至不会使用索引,除非我将FORCE INDEX强制使用(索引提示),它似乎并没有加快查询的执行速度。

3 个答案:

答案 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。)