繁体   English   中英

如何优化这个慢查询?

[英]How to optimize this slow query?

我有以下查询,运行速度非常慢(几乎50000条记录)

SELECT
  news.id,
  news.title,
  DATE_FORMAT(news.date_online,'%d %m %Y')AS newsNL_Date
  news_categories.parent_id
FROM 
  news,
  news_categories
WHERE 
  DATE(news.date_online)=2013-02-25 
  AND news.category_id = news_categories.id
  AND news.date_online < NOW()
  AND news.activated ='t' 
ORDER BY 
  news.date_online DESC

我有MySQL客户端版本5.0.96

当我对此查询运行EXPLAIN EXTENDED调用时,结果如下:

id    select_type   table             type     possible_keys                        key         key_len     ref               rows     Extra
1     SIMPLE        news              ref      category_id,date_online,activated    activated   1           const             43072    Using where; Using filesort
1     SIMPLE        news_categories   eq_ref   PRIMARY,id                           PRIMARY     4           news_category_id  1

我在以下几列上有一个索引news_id(主键)date_online激活category_id

当我查看EXPLAIN EXTENDED结果时,会看到USING_WHERE; 使用文件排序。 我知道它们都不好,但是我不知道如何解决。

尝试为date_online添加索引(B型树)。 另外,我会尽量避免在close位置使用NOW(),而是将其设置为变量,而改用变量。

我想id字段是键,所以它们已经被索引了。

使用左联接查看区别

SELECT
  news.id,
  news.title,
  DATE_FORMAT(news.date_online,'%d %m %Y')AS newsNL_Date
  news_categories.parent_id
FROM 
  news
LEFT JOIN news_categories ON news_categories.id = news.category_id
WHERE 
  DATE(news.date_online)= '2013-02-25'
  AND DATE(news.date_online) < DATE(NOW())
  AND news.activated ='t' 
ORDER BY 
  news.date_online DESC

除了其他有价值的建议,您还有DATE(news.date_online)= 2013-02-25。 这似乎迫使MySQL将表的每一行的news.date_online转换为不同的格式。 这将停止索引的使用。

可能将其更改为news.date_online在“ 2013-02-25 00:00:00”和“ 2013-02-25 23:59:59”之间 ,(我认为)应允许使用date_online上的索引

您的查询正在获取特定日期的数据,因此在这种情况下,您可以省略AND news.date_online < NOW()部分(也许查询优化器会为您执行此操作)。

在另一种情况下,如果您希望所有活动新闻都没有指定date_online ,则还应该摆脱NOW()。 问题是您的查询无法被数据库缓存,因为它包含的部分(NOW())对于每次执行都是不同的。 您可以通过在此处提供一个计算常数来实现。 如果您忽略比较中的分钟部分,则可以将其缓存为最大值。 60秒

接下来,你应该为你正在使用的列的多列索引,因为我想category_iddate_onlineactivated几乎在每一个查询中使用。 这会使插入速度稍慢一些,但是从(新闻应用程序)看起来,读取的内容要比插入的多得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM