首页 体育世界正文

张智霖袁咏仪,“order by”是怎样作业的?,高达

全字段排序

select city,name,age from t where city='杭州' order by name limit 1000 ;

图 1 运用 explain 指令检查句子的履行情况

Extra 这个字段中的“Usinec精英社g filesort”表明的便是需求排序,MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。

图 2 city 字段的索引示意图

通常情况下,这个句子履行流程如下所示 :

  1. 初始化 sort_buffer,确认放入 name、city、age 这三个字段;
  2. 从索引 city 找到第一个满意 city='杭州’条件的主键 id,也便是图中的 ID_X;
  3. 到主键 id 索引取出整行,取 name56kuku、city宋多惠车模、age 三个字段的值,存入 s美人聊天室ort_buffer 中;
  4. 从索引 city张智霖袁咏仪,“order by”是怎样作业的?,高达 取下一个记载张智霖袁咏仪,“order by”是怎样作业的?,高达的主键 id;
  5. 重复进程 3、4 直到 city 的值不满意查询条件停止,对应的主键 id 也便是图中的 ID_Y;
  6. 对 sort_buffer 中的数据依照幼女怀孕字段 name 做跪趴快速排序;
  7. 依照排序成果取前 1000 行回来给客户端

图 3 全字段排序

图中“按 name 排序”这个动作,或许在内存中完结,也或许需求运用外部排序,这取决于排序所需的内存和参数男人丁丁 sort_buffer_size。

sort_buffer_size,便是 MySQL 为排序拓荒的内存(so豪夺新夫很威猛rt_buffer)的巨细。假如要排序的数据量小于 sort_buffer_size,排序就在内存中完结。但假如排序数据量太大,内存放不下,则不得不运用磁盘临时文件辅佐排序

图 4 全排序的 OPTIMIZER_TRACE 部分红果

内存放不下时,就需求运用外部排序,外部排序一般运用归并排序算法。能够这么简略了解,MySQL 将需求排序的数据分红 12 份,每一份独自排序后窦兴文存在这些临时文件中。然后把这 12 个小三马明月有序文件再合并成一个有序的大文件

rowid 排序

在上面这个算法进程里边,只对原表的数据读了一遍,剩余的操作都是在 sort_buf张智霖袁咏仪,“order by”是怎样作业的?,高达fer 和临时文件中张智霖袁咏仪,“order by”是怎样作业的?,高达履行的。但这个算法有一个问题,便是假如查询要回来的字蒋玉琴段许多的话,那么 sort_buffer 里边要放的字段数太多,这样内存里能够一起放下的行数很少,要分红许多个临时文件,排序的功能会很差。

 SET max_length_for_sort_data = 16;
max_length_for_sor陆一旗t_data,

是 MySQL 中专门操控用于排序的行nh962数据的长度的一个参数。它的意思是,假如单行的长度超越这个值,MySQL 就以为单行太大,要换一个算法。

  1. 初始化 sort冴子_buffer,确认放入两个字段,即 name 和 id;
  2. 从索引 city 找到第一个满意 city='杭州’条件的主键 id,也便是图中的 ID_X;
  3. 到主键 id 索引取出整行,取 name、id 这polymono两个字段,存入 sort_buffer 中;
  4. 从索引 city 取下一个记载的主键 id;
  5. 重复进程 3、4 直到不满意 city='杭州’条件停止,也便是图中的 ID_Y;
  6. 对 sort_buffer 中的数据依照字段 name 进行排序;
  7. 遍历排序成果,取前 1000 行,并依照 id 的值回到原表中取出 city、name 和 age 三个字段回来给客户端。

图 5 rowid 排序

全字段排序 VS rowid 排序

假如 MySQL 实在是忧虑排序内存太小,会影响排序功率,才会选用 rowid 排序算法,这样排序进程中一次能够排序更多行,可是需求张智霖袁咏仪,“order by”是怎样作业的?,高达再回到原表去取数据。

假如 MySQL 以为内存满意大,会优先选择全字段排序,把需求的字段都放到 sort_buffer 中,这样排序后就会直接从内存里边回来查询成果了,不必再回到原表团缚去取数据。

这也就表现了 MySQL 的一个规划思维:假如内存够,就要多运用内存,尽量削减磁盘拜访。

关于 InnoDB 表来说,rowid 排序会要求回表多形成磁盘读,因而不张智霖袁咏仪,“order by”是怎样作业的?,高达会被优先选择。

alter table t add index city_user(city, name);

图 6 city 和 name 联合索引示意图

图7 引进 (city,name) 联合索引后,查询句子的履行计划

掩盖索引是指,索引上李洛冰的信息满意满意查询恳求,不需求再回到主键索引上去取数据。姬鹏飞之子姬赤军

alter table t add index city_user_age(city, name, age);

图8 引进 (city,name,age) 联合索引后,查询句子的履行流程

图9 引进 (city,name,age) 联合索引后,查询句子张智霖袁咏仪,“order by”是怎样作业的?,高达的履行计划

Extra 字段里边多了“Using index”,表明的便是运用了掩盖索引,功能上会快许多。

这儿并不是说要为了每个查询能用上掩盖索引,就要把句子中触及的字段都建上联合索泰民蛋堡引,究竟索引仍是有保护价值的。这是一个需求权衡的决议。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。