【发布时间】: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,速度提高数千倍。 -
"我已经正确设置了索引" -- 告诉我们。