mysql实战45将学习笔记--17

 17 如何正确地显示随机消息

在这里插入图片描述
在这里插入图片描述

内存临时表

       对于InnoDB表来说,执行全字段排序会减少磁盘访问,因此会被优先选择

       在10000行记录中随机取出3个单词
       mysql> select word from words order by rand() limit 3;
       执行步骤
       1.创建一个临时表,并且没有建立索引
       2.在words表中,按主键顺序取出所有的word值,并且调用rand()函数,执行完扫描行数为10000行
       3.按照第一个字段排序
       4.初始化sort_buffer
       5.从临时表取出第一个字段的值和位置信息,分别存入sort_buffer的字段中,这时扫描行数增加10000,变成20000
       6.在sort_buffer中根据第一个字段的值排序
       7.排序完成后,取出前三个结果的位置信息。因此扫描行数变为20003.

在这里插入图片描述
       POS就是位置信息。

Order by rand()使用了内存临时表,内存临时表排序的时候使用了rowid排序方法

       磁盘临时表
       tmp_table_size这个配置限制了内存临时表的大小,默认为16M,如果超过了tmp_table_size,那么内存临时表就会转成磁盘临时表。
       当使用磁盘临时表的时候,对应的就是一个没有显示索引的InnoDB表的排序过程
       Mysql5.6版本引入了新的排序算法,优先队列排序算法

在这里插入图片描述
       避免使用Order by rand()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值