有没有办法在主键上顺序读取MySql数据库?该文件包含大约1.5M行。我不想阅读所有这些并订购它们,只是这样我才能得到前100条记录。
我尝试了这段代码,但它似乎从关键范围中间的某个随机位置开始:
$query = "SELECT main_key FROM mytable LIMIT 100";
$table = mysql_query($query) or die(mysql_error());
while ($rec = mysql_fetch_row($table))
echo $rec[0].'<br>';
答案 0 :(得分:0)
除非您在ORDER BY子句中指定所需的顺序,否则SQL不保证订单。要获得前100条记录,请执行以下操作:
$query = "SELECT main_key FROM mytable order by main_key LIMIT 100";
数据库非常擅长优化查询,并且如果估计它是完成查询的最快方式,则会使用索引。不要试图再次猜测它:它可能比你或我更好。
答案 1 :(得分:0)
如果您想要它们,请使用ORDER BY子句:
SELECT main_key FROM mytable ORDER BY main_key LIMIT 100
答案 2 :(得分:0)
“我试过这段代码,但它似乎是从关键范围中间的某个随机位置开始的” SELECT main_key FROM mytable LIMIT 100
我想知道main_key
是否是mytable的PRIMARY KEY。我猜MySQL Optimizer选择非PK索引扫描。
恕我直言,你有两种可能的选择。
我认为FORCE INDEX
部队始终使用PRIMARY KEY
。
mysql> EXPLAIN SELECT main_key FROM tab_name FORCE INDEX(PRIMARY) LIMIT 10;
+----+-------------+-----------+-------+---------------+---------+---------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+-------+---------------+---------+---------+------+----------+-------------+
| 1 | SIMPLE | tab_name | index | NULL | PRIMARY | 8 | NULL | 13427712 | Using index |
+----+-------------+-----------+-------+---------------+---------+---------+------+----------+-------------+
MySQL有一个名为HANDLER
的有趣功能。使用HANDLER
,你可以打开某些INDEX(当然支持PRIMARY),你可以得到
N rows
从表格M rows
的Nth position
表格末尾的K rows
。所以,你不需要排序,保证获取订单。
-- OPEN HANDLER
HANDLER tab_name OPEN;
-- get first 100 records from PK
HANDLER tab_name READ `PRIMARY` FIRST LIMIT 100;
-- get next 100 records
HANDLER tab_name READ `PRIMARY` NEXT LIMIT 100;
-- get 100 records from End of Table
HANDLER tab_name READ `PRIMARY` LAST LIMIT 100;
-- CLOSE
HANDLER tab_name CLOSE;