MySQL:如何加速获取大量数据的查询,并使用
我有一个包含3666058条记录和6列的表,定义如下: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
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'