[英]MYSQL: Optimize Order By in Table Sort
我正在为我大学的网站开发一个应用程序,我想从数据库中按升序排列所有事件。 共有四个表:
表事件1
event_id, mediumint(8), Unsigned
date, date,
Index -> Primary Key (event_id)
Index -> (date)
表events_users
event_id, smallint(5), Unsigned
user_id, mediumint(8), Unsigned
Index -> PRIMARY (event_id, user_id)
表user_bm
link, varchar(26)
user_id, mediumint(8)
Index -> PRIMARY (link, user_id)
表user_eoc
link, varchar(8)
user_id, mediumint(8)
Index -> Primary (link, user_id)
查询:
EXPLAIN SELECT * FROM events1 E INNER JOIN event_users EU ON E.event_id = EU.event_id
RIGHT JOIN user_eoc EOC ON EU.user_id = EOC.user_id
INNER JOIN user_bm BM ON EOC.user_id = BM.user_id
WHERE E.date >= '2013-01-01' AND E.date <= '2013-01-31'
AND EOC.link = "E690"
AND BM.link like "1.1%"
ORDER BY E.date
说明:
上面的查询有两件事。
1)通过user_bm和user_eoc表搜索并筛选出所有学生。 “链接”列为非规范化列,可按专业/年/校区等快速过滤学生。
2)应用过滤器后,MYSQL会获取所有匹配学生的user_id,并找到他们正在参加的所有事件并按升序输出。
查询优化器说明:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE EOC ref PRIMARY PRIMARY 26 const 47 Using where; Using index; Using temporary; Using f...
1 SIMPLE BM ref PRIMARY,user_id-link user_id-link 3 test.EOC.user_id 1 Using where; Using index
1 SIMPLE EU ref PRIMARY,user_id user_id 3 test.EOC.user_id 1 Using index
1 SIMPLE E eq_ref PRIMARY,date-event_id PRIMARY 3 test.EU.event_id 1 Using where
题:
该查询工作正常,但可以进行优化。 具体来说-使用文件排序和使用临时文件非常昂贵,我想避免这种情况。 我不确定这是否可行,因为我想按日期“按日期排序”事件,这些事件与匹配的用户具有1:n的关系。 Order BY适用于联接表。
任何帮助或指导将不胜感激。 谢谢您,节日快乐!
排序可以通过两种方式完成。 通过索引或临时表。 您在表Events1中按日期排序,但它使用的PRIMARY KEY不包含日期,因此在这种情况下,需要在临时表中对结果进行排序。
虽然不一定昂贵。 如果结果足够小以适合内存,它将不是磁盘上的临时表,而只是内存中的表,这并不昂贵。
文件排序也不是。 “使用文件排序”并不意味着它将使用任何文件,仅意味着它没有按索引排序。
因此,如果您的查询执行得很快,您应该很高兴。 如果结果集很小,它将在内存中排序,并且不会创建任何文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.