[英]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_id
, date_online
和activated
几乎在每一个查询中使用。 这会使插入速度稍慢一些,但是从(新闻应用程序)看起来,读取的内容要比插入的多得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.