- 查询缓存被禁用!
- 索引是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查询需要更长的时间。
'LIMIT BigNumber,AnyNumber'已知很慢。 – 2011-12-28 18:02:13
更正:LIMIT mysql不使用主键作为id。查询开始生成行,当它碰到偏移行时,它开始输出它们,直到达到row_count。你可以尝试添加一个标题索引,看看是否有帮助(假设索引适合内存) – rene 2011-12-28 18:07:32