【问题标题】:Need to improve sql performance需要提高sql性能
【发布时间】:2013-04-22 10:09:30
【问题描述】:
Table temporary_search_table
post_id,property_status, property_address,....more 30 field

Table search_meta
meta_id,search_id,status,created_date

好的,我需要 created_date 是昨天的总数据。对于每个temporary_search_table 数据,search_meta 中可能有多个条目。所以我们需要从 search_meta 中选择最后一个字段并检查创建日期是昨天并且 property_status 是待定的。如果是,那么我们可以数一数。如果 search_meta 中没有可用于temporary_search_table 条目的数据,那么我们不需要在结果中计算该行。

我在这里附上我的 sql 数据。它的工作,但 30000 行需要很多时间。

SELECT COUNT(id) FROM temporary_search_table 
    WHERE property_status = 'pending' AND (1 = (SELECT DATEDIFF(NOW(), created_date) 
    FROM search_meta WHERE post_id = search_id ORDER BY created_date DESC LIMIT 0,1 ))

提前致谢。

【问题讨论】:

  • 两张表有索引吗?
  • 抱歉,我不明白你的问题。您的意思是表temporary_search_table 和search_meta 之间的关系吗?如果“是”,那么是的。 temporary_search_table 中的 post_id 是 serach_meta 表中的外键(search_id)。
  • 嗯,里面有一个相关的子查询。
  • @MonirulIslam 不,我的意思是temporary_search_table 中的property_status 列上是否有索引,search_meta 中的post_id 列上是否有索引?
  • 没有可用的索引。

标签: mysql sql join


【解决方案1】:

除了检查表上的索引之外,最好不要使用相关子查询,而是使用直接连接。

SELECT COUNT(id) 
FROM temporary_search_table 
INNER JOIN search_meta ON post_id = search_id
WHERE property_status = 'pending' AND DATEDIFF(NOW(), created_date) = 1
ORDER BY created_date DESC 
LIMIT 1

【讨论】:

  • 你能给我发个数据库索引教程吗?
  • @MonirulIslam 你先测试了这个 SQL 吗?
  • 是的,我已经测试过了。但似乎很慢:(
  • @MonirulIslam 然后我建议EXPLAIN <query> 看看有什么问题;还有SHOW CREATE TABLE temporary_search_table.
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2011-10-27
相关资源
最近更新 更多