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

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

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

  mysql> CREATE TABLE `test_b` (

  -> `Id` int(11) NOT NULL,

  -> `Type` int(11) DEFAULT NULL,

  -> PRIMARY KEY (`Id`),

  -> KEY `IDX_Type` (`Type`)

  -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  Query OK, 0 rows affected (0.20 sec)

  mysql> insert into test_b values(1,1),(2,6),(3,2),(7,3),(4,1);

  Query OK, 5 rows affected (0.09 sec)

  Records: 5 Duplicates: 0 Warnings: 0

  mysql> select * from test_b;

  +----+------+

  | Id | Type |

  +----+------+

  | 1 | 1 |

  | 4 | 1 |

  | 3 | 2 |

  | 7 | 3 |

  | 2 | 6 |

  +----+------+

  5 rows in set (0.03 sec)

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

  +----+------+

  | Id | Type |

  +----+------+

  | 1 | 1 |

  | 2 | 6 |

  | 3 | 2 |

  | 4 | 1 |

  | 7 | 3 |

  +----+------+

  5 rows in set (0.00 sec)

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

  mysql> insert into test_b values(9,3),(6,3),(10,3);

  Query OK, 3 rows affected (0.04 sec)

  Records: 3 Duplicates: 0 Warnings: 0

  mysql> select * from test_b ;

  +----+------+

  | Id | Type |

  +----+------+

  | 1 | 1 |

  | 4 | 1 |

  | 3 | 2 |

  | 6 | 3 |

  | 7 | 3 |

  | 9 | 3 |

  | 10 | 3 |

  | 2 | 6 |

  +----+------+

  8 rows in set (0.00 sec)

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

  当Type列的值一致的时候,插入到索引列的数据可以根据Id顺序插入到索引表中,保证了当Type一致的时候,会按照Id排序。

分类:mssql数据库 时间:2012-01-08 人气:6
本文关键词:
分享到:

相关文章

  • MySQL中select语句介绍及使用示例 2012-06-15

    数据表都已经创建起来了,我们就可以用自己喜欢的方式对数据表里面的信息进行检索和显示了,下面为大家讲解下MySQL中select语句的应用,感兴趣的碰可以学习下 数据表都已经创建起来了,假设我们已经插入了许多的数据,我们就可以用自己喜欢的方式对数据表里面的信息进行检索和显示了,比如说:可以象下面这样把整个数据表内的内容都显示出来 select * from president; 也可以只选取某一个数据行里的某一个数据列 select birth from president where last_

  • MySQL中的SELECT语句基本语法 2012-09-02

      MySQL中SELECT语句的基本语法是:   以下是引用片段:   SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]   [SQL_BIG_RESULT] [HIGH_PRIORITY]   [DISTINCT|DISTINCTROW|ALL]   select_list   [INTO {OUTFILE|DUMPFILE} 'file_name' export_options]   [FROM table_references [WHERE where_

  • 快速掌握MySQL数据库中SELECT语句 2014-03-23

      本文针对MySQL数据库中的SELECT语句快速精细掌握。   MySQL中SELECT语句的基本语法是:   以下是引用片段:   SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]   [SQL_BIG_RESULT] [HIGH_PRIORITY]   [DISTINCT|DISTINCTROW|ALL]   select_list   [INTO {OUTFILE|DUMPFILE} 'file_name' export_options]   [FRO

  • mysql的行锁与表锁(select* .... FOR UPDATE) 2014-08-28

      mysql中使用select for update的必须针对InnoDb,并且是在一个事务中,才能起作用。   select的条件不一样,采用的是行级锁还是表级锁也不一样。   由于 InnoDB 预设是 Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行 Row lock (只锁住被选取的资料例) ,否则 MySQL 将会执行 Table Lock (将整个资料表单给锁住)。   举个例子:   假设有个表单 products ,?面有 id 跟 name 二个

  • MySQL 5.6 Replication复制FAQ 2012-02-03

    MySQL 5.6 Replication复制FAQ 原文请参照MySQL官方文档Reference Manual,版本5.6.10。 复制功能使得数据可以从一个MySQL数据库(master主库)复制到另一个或多个MySQL数据库(slave从库)。缺省情况下,复制是异步的,slave无需保持持久的连接来从master获得更新。这意味着更新能工作在远程连接,甚至是临时间断性的连接上,比如拨号连接服务。根据不同的配置,你能复制master上所有的数据库,或指定的数据库,甚至某一数据库中指定的数据

  • 在CentOS 6.3中安装与配置Mysql-5.5.29的方法 2012-02-04

    一、安装mysql 安装方式分为:rpm和源码编译安装两种,本文采用mysql源码编译方式,编译器使用Cmake。软件需要mysql-5.5.29.tar.gz和cmake-2.8.10.2.tar.gz,请自行下载。 下载地址: http://mysql.mirror.kangaroot.net/Downloads/ http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz 其中mysql使用最新的稳定版本,即最新试用版的上一个版本,且非rc或

  • Mysql的主从复制和级联 2012-02-13

    Mysql的主从复制和级联 记录一下mysql的主主复制和级联复制。 一、环境 主机:192.25.10.71 主机:192.25.10.73 从机:192.25.10.76 DB:Mysql 5.5.31 OS:CentOS 6.3 二、架构 三、实施步骤 mysql的安装略 1.master端创建测试DB [[email protected] ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL con

  • 解析mysql中如何获得数据库的大小 2012-02-14

    1.查看mysql数据库大小SELECT sum(DATA_LENGTH)+sum(INDEX_LENGTH) FROM information_schema.TABLES where TABLE_SCHEMA='数据库名'; 得到的结果是以字节为单位,除1024为K,除1048576(=1024*1024)为M。 2.查看表的最后mysql修改时间select TABLE_NAME,UPDATE_TIME from INFORMATION_SCHEMA.tables where TABLE_S

  • Windows Server 2003 下配置 MySQL 集群(Cluster)教程 2012-02-17

      这篇文章主要介绍了Windows Server 2003 下配置 MySQL 集群(Cluster)教程,本文先是讲解了原理知识,然后给出详细配置步骤和操作方法,需要的朋友可以参考下   MySQL 群集是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1 个群集中运行多个 MySQL 服务器。在 MySQL 5.0 及以上的二进制版本中,以及与最新的 Linux 版本兼容的 RPM 包中提供了该存储引擎。   MySQL 群集是一

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.055 (s). 10 q(s)