我有一个关于mysql的辣问题......
这里的想法是从表中选择n个最后记录,按属性过滤(可能来自另一个表)。那很简单。
此时你想回复:
让n = 10
SELECT *
FROM huge_table
JOIN another_table
ON another_table.id = huge_table.another_table_id
AND another_table.some_interesting_property
ORDER BY huge_table.id DESC
LIMIT 10
如果没有JOIN就可以了,mysql从最后读取索引,并给我10个项目,执行时间可以忽略不计 使用连接,执行时间取决于表的大小,并且在许多情况下不可忽略,解释说mysql是:“使用where;使用索引;使用临时;使用filesort”
MySQL文档(http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html)声明:
“您正在加入许多表,并且ORDER BY中的列不是来自用于检索行的第一个非常量表。(这是EXPLAIN输出中没有const连接类型的第一个表。)“
解释为什么MySQL不能使用索引来解析我的ORDER BY而不喜欢大文件排序...
我的问题是:使用ORDER BY ... LIMIT 10来获取最后一项是否自然?在升序卡片组中挑选最后10张牌时,你真的这样做了吗?就个人而言,我只是从底部挑选了10个......
我尝试了很多种可能性,但所有结果都给出了这样的结论:我很快就能查询10个第一个元素,并且慢慢地查询10个ORDER BY子句的最后一个原因。
“选择最后10个”真的可以快吗?我哪里错了?
答案 0 :(得分:0)
好问题,我认为你应该按列排序,即id为DESC索引 这应该可以解决问题 http://dev.mysql.com/doc/refman/5.0/en/create-index.html
答案 1 :(得分:0)
我在复制你的情况时遇到了麻烦。我的ASC
/ DESC
模拟使用huge_table
或another_table
,我的EXPLAIN
和执行时间都显示大约N
行和逻辑连接。您使用的是哪个版本的MySQL?
此外,从EXPLAIN
doc开始,它指出Using index
表示
仅使用索引树中的信息从表中检索列信息,而无需执行额外的搜索来读取实际行
与您正在进行SELECT *
的事实不符,除非您的索引覆盖整个表格。
也许你应该展示你的架构,包括索引和EXPLAIN
输出。
答案 2 :(得分:0)
使用连接,您现在将行限制为“some_interesting_property”,并且您的huge_table中的ID可能不再是连续的...尝试在another_table(some_interesting_property,id)上的索引以及huge_table(another_table_id,id)并查看如果您的EXPLAIN为您提供了更好的提示。