我有1000多万行.计算行数太慢.我想估计行数.

当前查询如下:

SELECT count(*) FROM `database` WHERE `location` LIKE '%New York%'

这给了我确切的数字,而且速度太慢了.我想要的是这样的:

ESTIMATE count(*) FROM `database` WHERE `location` LIKE '%New York%'

也许可以通过将查询限制在表的一个子集(每N行或其他)来实现.也许有一个内置的功能可以使用.

编辑:也许我可以将查询限制为每N行一次?然后乘以n.

Edit2:我只是试着每10行数一次,然后将计数乘以10,但速度没有提高,尽管自动递增的"计数器"是主键.

SELECT count(*) FROM database WHERE `location` LIKE '%Los Angeles%' and counter%10 = 0

推荐答案

COUNT(*)的性能并不是本例中最大的性能问题.性能无法提高,因为搜索条件LIKE '%...%'必须运行表扫描.无论如何,它必须判断表中的每一行,以判断它是否符合您的条件.

加快速度的替代方案:

  • 使用fulltext indexing而不是LIKE个带通配符的谓词匹配模式

  • 存储计数,并在添加或更改数据时保持更新,正如上面的注释所示(但每个可能的搜索模式都需要一个单独的计数器)

  • 买一台功能更强大的电脑

  • 存储更少的数据

Mysql相关问答推荐

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

过程/别名是有点长的MySQL命令的一部分吗?

MariaDB字段+1

MySQL:一个查询中的SELECT语句,用于从一个表中检索所有数据,并仅从另一个表中检索一个数据

从insert语句获取新生成的虚拟UUID

为什么MySQL派生条件下推优化不起作用

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

SQL:如何 Select 每个客户最后购买的产品?

根据时间戳分组删除

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

「已解决」MySQL 连接在 vb6 上出现运行时错误 -2147467259 (80004005),但在 VBA Excel 上工作

如何在Pandas 中使用 to_sql

优化解析 5000 万行 MySQL 表的请求

我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据

插入重复键查询以在每一行上进行自定义更新

MySQL查询根据同一表中其他字段的值更新表中的字段

Doctrine2 迁移向下迁移并从浏览器而不是命令行迁移

phpMyAdmin - 无法连接 - 无效设置 - 自从我添加了 root 密码 - 被锁定

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

如何将数组存储到mysql中?