Mysql 防止在查询中使用临时表

Mysql 防止在查询中使用临时表,mysql,query-optimization,Mysql,Query Optimization,我正在对下面的查询运行explain extended,我不确定为什么会发生这种情况。我在site.id、site.parent\u id和site.enabled上添加了一个索引,但我仍然看到它正在创建一个临时表 SELECT site.label AS site_label, deal . * , site.id AS site_id FROM site LEFT JOIN deal ON ( deal.site_id = site.id AND DAYOFYEAR( deal.create

我正在对下面的查询运行explain extended,我不确定为什么会发生这种情况。我在
site.id、site.parent\u id和site.enabled上添加了一个索引,但我仍然看到它正在创建一个临时表

SELECT site.label AS site_label, deal . * , site.id AS site_id
FROM site
LEFT JOIN deal ON ( deal.site_id = site.id
AND DAYOFYEAR( deal.created ) = DAYOFYEAR( NOW( ) ) ) 
WHERE (
site.id =2
OR site.parent_id =2
)
AND site.enabled =1
ORDER BY site.order ASC , deal.created DESC
有没有关于如何防止使用临时表的建议

id  select_type table   type    possible_keys   key key_len ref rows    filtered    Extra
1   SIMPLE  site    ALL id,parent_id,id_2   NULL    NULL    NULL    10  100.00  Using where; Using temporary; Using filesort
1   SIMPLE  deal    ref site_id site_id 4   dealclippings.site.id   235 100.00   

您执行的查询无法很好地优化:

  • 尽量避免使用
  • Mysql无法优化(使用索引)以进行不同方向的排序(您同时使用
    ASC
    DESC
    顺序进行排序)
  • DAYOFYEAR(deal.created)
    避免在您搜索的字段上使用函数

  • 但是在您对查询性能感到满意之前,您不应该知道
    临时表
    标签,是吗?

    您的目标是让查询执行得更快,还是仅仅为了避免
    临时表
    标签
    我仍然看到它正在创建一个临时表
    那又怎样?谢谢你的帮助。。。。我很满意,但因为这是我网站上的主要查询,我想我还是看看它是否可以改进。@Webnet:10x235行太少了,不必担心。但无论如何,记住我上面提到的第1、2、3项