知识大全 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相关参考