MySQL中的ORDER BY排序实现方式

   总的来说,在 MySQL 中的ORDER BY有两种排序实现方式,一种是利用有序索引获取有序数据,另一种则是通过相应的排序算法,将取得的数据在内存中进行排序。

   下面将通过实例分析两种排序实现方式及实现图解:

    假设有 Table A 和 B 两个表结构分别如下:

sky@localhost : example 01:48:21> show create table A\G
*************************** 1. row ***************************
  Table: A
  Create Table: CREATE TABLE `A` (
   `c1` int(11) NOT NULL default '0',
   `c2` char(2) default NULL,
       `c3` varchar(16) default NULL,
       `c4` datetime default NULL,
  PRIMARY KEY (`c1`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8

sky@localhost : example 01:48:32> show create table B\G
*************************** 1. row ***************************
 Table: B
   Create Table: CREATE TABLE `B` (
    `c1` int(11) NOT NULL default '0',
       `c2` char(2) default NULL,
       `c3` varchar(16) default NULL,
       PRIMARY KEY (`c1`),
       KEY `B_c2_ind` (`c2`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8

   1、利用有序索引进行排序,实际上就是当我们 Query 的 ORDER BY 条件和 Query 的执行计划中所利用的 Index  的索引键(或前面几个索引键)完全一致,且索引访问方式为 rang、 ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。这种方式的 ORDER BY 基本上可以说是最优的排序方式了,因为 MySQL 不需要进行实际的排序操作。

假设我们在Table A 和 B 上执行如下SQL:

sky@localhost : example 01:44:28> EXPLAIN SELECT A.* FROM A,B
 -> WHERE A.c1 > 2 AND A.c2 < 5 AND A.c2 = B.c2 ORDER BY A.c1\G

***********1. row ***************************
   id: 1
   select_type: SIMPLE
   table: A
   type: range
   possible_keys: PRIMARY
   key: PRIMARY
   key_len: 4
   ref: NULL
   rows: 3

 Extra: Using where
 ************* 2. row ***************************
 id: 1
   select_type: SIMPLE
   table: B
   type: ref
   possible_keys: B_c2_ind
   key: B_c2_ind
   key_len: 7
   ref: example.A.c2
   
   rows: 2
   Extra: Using where; Using index

    我们通过执行计划可以看出,MySQL实际上并没有进行实际的排序操作,实际上其整个执行过程如下图所示:

  

    转自:http://tech.it168.com/a2009/0326/269/000000269722.shtml

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值