【问题标题】:SELECT COUNT(0) on big table is slow大表上的 SELECT COUNT(0) 很慢
【发布时间】:2015-09-02 15:10:06
【问题描述】:
SELECT COUNT(0) FROM ts_client
LEFT JOIN ts_shop_client ON shop_client_id_client = client_id
WHERE client_email IS NOT NULL AND shop_client_id_shop = 1

说明:

ts_client 中的行数为 4904908,ts_shop_client 中的行数为 3547939。

我已经正确设置了索引并且 sql 的慢时间是 5,49 - 9,50s。

大家好。

任何加速 sql 的解决方案?

表 ts_client

表 ts_shop_client

索引 ts_shop_client

谢谢

【问题讨论】:

  • 您尝试过吗:从 ts_client 中选择 COUNT(0) 左加入 ts_shop_client 在 shop_client_id_client = client_id 和 client_email 不为空且 shop_client_id_shop = 1
  • 我假设client_email 在ts_client 表上,shop_client_id_shop 在ts_shop_client 表上。您是否意识到在where 子句中包含来自外部联接表的列会将外部联接转换回内部联接?这是你想要的吗?
  • @Balinti:那几乎肯定会返回不同的结果。
  • 你正在对一个有 550 万条记录的表进行全表扫描,这就是它速度慢的原因——它在你的(慢速)硬盘上执行搜索。由于您的查询不能(正确)利用索引,因为这些索引(如果已设置)将具有低选择性,因此最好的方法是将两个表都转换为 InnoDB 并将 innodb_buffer_pool_size 提高到可以在内存中容纳两个表的数量.这会将您的 I/O 从磁盘转换为 RAM,速度提高数千倍。
  • "我已经正确设置了索引" -- 告诉我们。

标签: mysql sql mariadb


【解决方案1】:

添加

INDEX(shop_client_id_client, shop_client_id_shop) -- in either order.

这样的索引将缩小您需要查看的行数。这样可以加快速度。

之前,它必须读取然后跳过shop_client_id_shop 不是 1 的每一行。

【讨论】:

  • 对添加索引的影响的一些解释,无论是为了解决问题还是为了任何缺点/权衡,都会改进这一单行作为答案。
  • 没有解决我的问题,我在我的问题中添加了索引屏幕,请查看
  • 两个字段上的两个单独索引NOT与两个字段上的复合索引相同。请尝试我建议的INDEX。
  • @RickJames:在我看来,屏幕截图中的第一个索引就是您要求的索引。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 2012-10-13
  • 2021-08-29
  • 2012-02-17
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多