MySQL:如何加速获取大量数据的查询,并使用

MySQL:如何加速获取大量数据的查询,并使用,mysql,sql,indexing,Mysql,Sql,Indexing,我有一个包含3666058条记录和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

我有一个包含3666058条记录和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
。因此,我运行以下查询:
从烦恼中选择a、b、c,其中a类似于“aaa%”。这将从表中获取约1835000条记录

我的问题是:这个查询非常慢(当然是在没有缓存的情况下),有时需要几分钟的时间


那么,对于这个特定的查询,我如何使事情变得更快呢?我尝试过在
a
(大小3或不指定大小)上创建索引,但没有成功:MySQL甚至不会麻烦使用索引,除非我使用
force index
(索引提示)强制它,而且它似乎没有加快查询执行

从360万行中提取180万行基本上需要扫描整个表。要提高性能,您所能做的不多

索引不会有帮助。如果您正在从表中提取1000行,那么索引会有所帮助。而且,
a
上的索引将用于类似于
。您也可以将其表述为:

where a >= 'aaa' and a < 'aab'
其中a>='aaa'和a<'aab'
如果您想让优化器更容易地选择索引。

您是否尝试过左() 根据这项测试,它比同类产品快。

索引(a,b,d)
(或
(a,d,b)
)将运行得更快,因为它将是一个“覆盖”索引


(将
d
更改为
c
,如果
c
确实是您正在获取的内容。)

我建议重新考虑整个方法,从“为什么需要快速获取180万行?”开始。左侧
将不允许使用
索引(a)
。一般来说:在函数中隐藏索引列会阻止使用该索引。该引用对MySQL无效,因为它引用SQL Server。此外,该引用正在检查给定子字符串的字符串两端;这比OP要求的要复杂得多。
SELECT a,b,c from annoyance where LEFT(a,3) = 'aaa'