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

标签 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 强制它 (索引提示),它似乎并没有加速查询执行。

最佳答案

从 360 万行中提取 180 万行基本上需要扫描整个表。要提高性能,您无能为力。

索引无济于事。如果您要从表中获取,比如说 1000 行,那么索引可以提供帮助。并且,a 上的索引将用于like。您也可以将其表述为:

where a >= 'aaa' and a < 'aab'

如果你想让优化器更容易选择索引。

关于MySQL:如何加速查询获取大量数据并使用 LIKE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54184614/

相关文章:

mysql - 按使用标签的帖子数量对标签进行排序?

java - Lucene/Hibernate Search - 查询关联的集合?

MySQL - 对于大 IN 条件不使用索引

mysql - phpmyadmin 创建 ENUM 错误

mysql - 类型错误 : Converting circular structure to JSON when getting data from mysql DB

mysql - 仅允许具有标识符的实体将实体绑定(bind)到查询参数

ios - SWIFT - UITableView 的数字滚动

mysql - 错误 1215 无法添加外键约束

两个 SELECT 语句之间的 MySQL 笛卡尔积

c# - LinqToEntities 在 LEFT OUTER JOIN 中使用小于号 (<)