MySQL SELECT COUNT(1)语句在百万行表上太慢



下面的语句耗时0.73秒,生成54,000个结果:

SELECT COUNT(1) FROM `table` WHERE MATCH(tagline, location, country) AGAINST(' +Germany' IN BOOLEAN MODE)

该语句耗时28秒,生成330万个结果:

SELECT COUNT(1) FROM `table` WHERE MATCH(tagline, location, country) AGAINST(' +United +States' IN BOOLEAN MODE)

是否有一种方法可以通过某种方式将结果限制在100万来限制查询时间?

像这样:

COUNT THIS -->    
SELECT * FROM `table` WHERE MATCH(tagline, location, country) AGAINST(' +United +States' IN BOOLEAN MODE)
LIMIT 1000000  

回答我自己的问题:

将select查询括起来:

SELECT COUNT(1) FROM ( ... ) as someRandomWord

我的select查询被修改为这样可以限制结果:

SELECT counter FROM `table` WHERE MATCH(tagline, location, experience, country) AGAINST(' +United +States' IN BOOLEAN MODE) limit 1000000

把这两个放在一起:

SELECT COUNT(1) FROM (
SELECT counter FROM `table` WHERE MATCH(tagline, location, experience, country) AGAINST(' +business' IN BOOLEAN MODE) limit 1000000
) as someRandomWord

"Germany"——比;54,000个结果(0.76秒)

"曼联States"——比;"超过一百万个结果";(2.4秒)

您应该运行explain plan并找出您的低效之处。您可以在本文中看到如何分析explain plain:

https://dev.mysql.com/doc/refman/8.0/en/execution-plan-information.html重点:

  1. 您的目标是识别EXPLAIN计划中表明查询优化得很好的方面,并在看到一些低效的操作时学习SQL语法和索引技术以改进计划。
  2. 在EXPLAIN的帮助下,您可以看到应该在表中添加索引,以便通过使用索引查找
  3. 来加快语句的执行速度
  4. 还可以使用EXPLAIN来检查优化器是否以最优顺序连接表。
  5. EXPLAIN语句提供MySQL如何执行语句的信息。EXPLAIN与SELECT, DELETE, INSERT, REPLACE和UPDATE语句一起工作。

根据你的SQL显示你正在使用MySQL

最终结果可能是添加索引。本文将帮助您创建索引:

https://www.tutorialspoint.com/mysql/mysql-indexes.htm重点:

  1. 创建索引可以提高访问数据的速度,但是需要占用磁盘空间来维护索引。下面是如何创建索引:CREATE INDEX AUTHOR_INDEX ON tutorials_tbl (tutorial_author DESC)
  2. DESC/ASC -你应该考虑数据的自然顺序和基于你想要访问它的最有可能的方式的顺序。如果它是时间序列,你总是想要最新的数据,使用DESC顺序。

最新更新