知识大全 MySQL在有索引列情况下select *的输出结果顺序

Posted 索引

篇首语:疾风知劲草,板荡识诚臣。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 MySQL在有索引列情况下select *的输出结果顺序相关的知识,希望对你有一定的参考价值。

MySQL在有索引列情况下select *的输出结果顺序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  创建一个表格 一个是主键列 一个是索引列 然后插入一批数据 调用select * from test_b 可以发现输出结果并没有按照Id有序 而是按照Type有序

  如果希望按照Id有序 可以使用force index (primary)这一hint语句

  mysql> CREATE TABLE `test_b` (

   > `Id` int( ) NOT NULL

   > `Type` int( ) DEFAULT NULL

   > PRIMARY KEY (`Id`)

   > KEY `IDX_Type` (`Type`)

   > ) ENGINE=InnoDB DEFAULT CHARSET=utf ;

  Query OK rows affected ( sec)

  mysql> insert into test_b values( ) ( ) ( ) ( ) ( );

  Query OK rows affected ( sec)

  Records: Duplicates: Warnings:

  mysql> select * from test_b;

  + + +

  | Id | Type |

  + + +

  | | |

  | | |

  | | |

  | | |

  | | |

  + + +

   rows in set ( sec)

  mysql> select * from test_b force index (primary);

  + + +

  | Id | Type |

  + + +

  | | |

  | | |

  | | |

  | | |

  | | |

  + + +

   rows in set ( sec)

  观察select * from test_b的前两条结果 ( ) ( ) 当Type相等的时候 按照Id排序 为了确认这一点 再多插入点数据观察 结论相同

  mysql> insert into test_b values( ) ( ) ( );

  Query OK rows affected ( sec)

  Records: Duplicates: Warnings:

  mysql> select * from test_b ;

  + + +

  | Id | Type |

  + + +

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  | | |

  + + +

   rows in set ( sec)

  默认情况下为什么会结果按照索引列有序呢?这还要从数据库内部的运行机制说起 首先系统会查询索引表(test_b_indexed_type) 该索引表的主键是索引列type(通常为了保证主键唯一性 type后面会添加一个id后缀) 通过索引列查到Id 然后拿着这些Id去test_b中查询最终结果 为了最高效 扫描索引表的时候会顺着type主键往下扫 然后拿扫得的id去“逐个”请求test_b 于是自然就出现了按照索引列有序的结果

cha138/Article/program/MySQL/201311/29567

相关参考