iteye_15485 2010-05-03 21:42
浏览 172
已采纳

mysql的一个奇怪问题

引擎是MyISAM,当需要扫描的行数大于等于15的时候,它就不使用索引而是全表扫描

mysql> desc customer;
+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)  | NO   | UNI | NULL    |                |
| address    | varchar(255)  | YES  |     | NULL    |                |
| linkman    | varchar(255)  | YES  |     | NULL    |                |
| mobile     | varchar(255)  | YES  |     | NULL    |                |
| phone      | varchar(255)  | YES  |     | NULL    |                |
| fax        | varchar(255)  | YES  |     | NULL    |                |
| memo       | varchar(2500) | YES  |     | NULL    |                |
| createDate | datetime      | YES  |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+

mysql> show index from customer \G
*************************** 1. row ***************************
       Table: customer
  Non_unique: 0
    Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
   Collation: A
Cardinality: 841
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:
*************************** 2. row ***************************
       Table: customer
  Non_unique: 0
    Key_name: name
Seq_in_index: 1
Column_name: name
   Collation: A
Cardinality: 841
    Sub_part: NULL
      Packed: NULL
        Null:
  Index_type: BTREE
     Comment:

mysql> explain select * from customer order by id limit 15;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | customer | ALL  | NULL          | NULL | NULL    | NULL |  841 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+

mysql> explain select * from customer order by id limit 14;
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref  | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
|  1 | SIMPLE      | customer | index | NULL          | PRIMARY | 8       | NULL |   14 |       |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+

mysql> explain select * from customer order by id limit 7,8;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | customer | ALL  | NULL          | NULL | NULL    | NULL |  841 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+

mysql> explain select * from customer order by id limit 7,7;
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref  | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+
|  1 | SIMPLE      | customer | index | NULL          | PRIMARY | 8       | NULL |   14 |       |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------+

  • 写回答

1条回答 默认 最新

  • oliverpeng 2010-05-07 03:40
    关注

    MyISAM每个表都有一个索引文件和数据文件,如果是通过索引来查找,会首先将索引信息载入内存然后找到对应的数据地址然后从数据文件中读取数据。如果MySQL觉得数据很少,就会直接将所有数据载入内存来操作,避免先去读取索引文件。

    如果你的表中有很多数据,你会发现MySQL会尽可能使用索引。

    另外如果你只查询索引信息,例如:

    explain select id from customer order by id limit 15;

    你会发现它会一直用索引,因为那样最快。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机