【问题标题】:mysql query performace is too low,how can i improve itmysql查询性能太低,如何改善
【发布时间】:2014-10-06 21:46:06
【问题描述】:

我有 3 个表,users,user_to_topics,topics。

SELECT
topics.* FROM
user_to_topics INNER JOIN topics
ON topics.id = user_to_topics.topic_id
WHERE user_to_topics.user_id=12345
ORDER BY topics.created_at DESC
LIMIT 10

topics表有5M条记录,user_to_topics有10M条记录,这条sql表示查找id为12345的用户所有感兴趣的topics,按created_at DESC排序

当我这样查询时

SELECT topic_id FROM user_to_topics WHERE user_id = 12345

然后

SELECT * FROM topics WHERE id IN (the results above) ORDER BY created_at DESC LIMIT 10

也很慢

我上面使用的所有列都添加了单列索引

我应该如何为这些表添加索引或者我应该改变这些表的结构?

【问题讨论】:

  • 尝试使用explain select ... 找出您需要索引的位置。
  • 尝试创建复合索引:CREATE INDEX user_to_topics_i1 ON user_to_topics(user_id, topic_id)
  • 你用的是什么sql版本?
  • 5.6.21,
    CREATE INDEX user_to_topics_i1 ON user_to_topics(user_id, topic_id)
    还是很慢

标签: mysql


【解决方案1】:

在查询前使用 EXPLAIN,然后查看应该索引哪些列,通常是那些使用较多的列,我已将 AJAX 请求时间从 1.6 分钟减少到 7 秒,并使用索引

【讨论】:

    【解决方案2】:

    在选择查询中使用 column_name 而不是 *。

    使用 * 从表中获取所有列,可能会减慢您的查询速度。

    使用执行查询所需的列名。

    【讨论】:

    • 我可以只选择几列,但我认为这不是这个问题的关键,每个用户可能有1万个感兴趣的主题,无论我如何设计我的sql,它都使用文件排序来排序符合条件的主题,但不使用索引对其进行排序
    【解决方案3】:

    尝试使用下面的查询,我认为您的查询结构可能是它需要时间的原因

    Select * From db.topics, db.users, db.user_to_topics
    where topics.id = user_to_topics.topic_id
    and user_id = '12345'
    order by topics DESC
    limit 10;
    

    这应该运行得更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 2022-01-04
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多