在主键上按顺序读取MySql

时间:2013-12-18 06:49:08

标签: php mysql

有没有办法在主键上顺序读取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>';

3 个答案:

答案 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 |
+----+-------------+-----------+-------+---------------+---------+---------+------+----------+-------------+

使用HANDLER

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;
  • 正反
    • 非常快
  • 缺点
    • 这不是ANSI标准
    • 您无法指定要检索的列。
    • 返回表格的所有列。