2011-12-28 68 views
1
  • 查询缓存被禁用!
  • 索引是100%在RAM加载
  • 指数只有ID

1benchmark:Mysql查询不使用主键

"SELECT title FROM posts LIMIT ?, 15"; 
? = rand(1,183655); 

EXPLAIN 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE posts ALL  NULL NULL NULL NULL 183637 

做100个循环后它接管100秒。

2Benchmark:

"SELECT title FROM posts WHERE id = 78845 OR id = 158738 OR id = 57065 OR id = 146797 OR id = 78918 OR id = 65227 OR id = 117987 OR id = 92541 OR id = 39782 OR id = 1958 OR id = 180384 OR id = 170758 OR id = 102227 OR id = 180223 OR id = 46391"; 

    in each loop every id is generated via rand(1,183655); 

做100个循环花费6秒来完成,它使用主键后。

的问题是我觉得在LIMIT MySQL不使用主键ID

再次与极限测试之后:

SECONDS:  LOOPS: SQL: 
41.560034990311 = 30 = "SELECT title FROM posts LIMIT ?, 15"; 
36.302664995193 = 30 = "SELECT title FROM posts ORDER BY id LIMIT ?, 15"; 
70.335160970688 = 30 = "SELECT title FROM posts ORDER BY id ASC LIMIT ?, 15"; 
48.453547000885 = 30 = "SELECT id, title FROM posts LIMIT ?, 15" 

不知怎的,但我不是100%肯定。我更新了我的VMware PHP5.1.6到PHP5.3,因为后来我发现,这些LIMIT查询需要更长的时间。

+0

'LIMIT BigNumber,AnyNumber'已知很慢。 – 2011-12-28 18:02:13

+0

更正:LIMIT mysql不使用主键作为id。查询开始生成行,当它碰到偏移行时,它开始输出它们,直到达到row_count。你可以尝试添加一个标题索引,看看是否有帮助(假设索引适合内存) – rene 2011-12-28 18:07:32

回答

2

您可以改为运行以下命令:

SELECT title 
FROM posts 
WHERE id >= ? 
LIMIT 15 

它不等同于LIMIT ?, 15但它会使用索引。

您还可以查看此related article

+0

啊多数民众赞成在伟大的!谢谢!现在查询需要1.5秒的100循环,真的非常感谢! – user1015314 2011-12-28 18:12:37

+0

查看我添加的文章链接。 – 2011-12-28 18:17:34

+0

感谢非常有趣的网站 – user1015314 2011-12-28 22:53:36