We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
对于显示随机消息,一般会想到用 order by rand() 实现,以下是 explain 结果 Extra 字段表示会用到临时表,会进行排序操作
order by rand()
对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。优化器没有了这一层顾虑,那么它会优先考虑的,就是用于排序的行越小越好了,所以,MySQL 这时就会选择 rowid 排序。
这条语句的执行流程是这样的:
位置信息 rowid 是每个引擎用来唯一标识数据行的信息。
tmp_table_size这个配置限制了内存临时表的大小,默认值是 16M。如果临时表大小超过了 tmp_table_size,那么内存临时表就会转成磁盘临时表 磁盘临时表使用的引擎默认是 InnoDB,是由参数 internal_tmp_disk_storage_engine 控制的 当使用磁盘临时表的时候,对应的就是一个没有显式索引的 InnoDB 表的排序过程
tmp_table_size
internal_tmp_disk_storage_engine
MySQL 5.6 版本引入了优先队列排序算法,可以减少很多计算量。
MySQL 处理 limit Y,1 的做法就是按顺序一个一个地读出来,丢掉前 Y 个,然后把下一个记录作为返回结果,因此这一步需要扫描 Y+1 行。再加上,第一步扫描的 C 行,总共需要扫描 C+Y+1 行,执行代价比随机算法 1 的代价要高
The text was updated successfully, but these errors were encountered:
因为随机算法 2 进行 limit 获取数据的时候是根据主键排序获取的,主键天然索引排序。获取到第 9999 条的数据也远比 order by rand() 方法的组成临时表R字段排序再获取 rowid 代价小的多
Sorry, something went wrong.
git-zjx
No branches or pull requests
对于显示随机消息,一般会想到用
order by rand()
实现,以下是 explain 结果Extra 字段表示会用到临时表,会进行排序操作
内存临时表
对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。优化器没有了这一层顾虑,那么它会优先考虑的,就是用于排序的行越小越好了,所以,MySQL 这时就会选择 rowid 排序。
这条语句的执行流程是这样的:
位置信息 rowid 是每个引擎用来唯一标识数据行的信息。
磁盘临时表
tmp_table_size
这个配置限制了内存临时表的大小,默认值是 16M。如果临时表大小超过了tmp_table_size
,那么内存临时表就会转成磁盘临时表磁盘临时表使用的引擎默认是 InnoDB,是由参数
internal_tmp_disk_storage_engine
控制的当使用磁盘临时表的时候,对应的就是一个没有显式索引的 InnoDB 表的排序过程
MySQL 5.6 版本引入了优先队列排序算法,可以减少很多计算量。
随机排序方法-1
这个方法效率很高,因为取 max(id) 和 min(id) 都是不需要扫描索引的,而第三步的 select 也可以用索引快速定位,可以认为就只扫描了 3 行。但实际上,这个算法本身并不严格满足题目的随机要求,因为 ID 中间可能有空洞,因此选择不同行的概率不一样,不是真正的随机
随机排序方法-2
MySQL 处理 limit Y,1 的做法就是按顺序一个一个地读出来,丢掉前 Y 个,然后把下一个记录作为返回结果,因此这一步需要扫描 Y+1 行。再加上,第一步扫描的 C 行,总共需要扫描 C+Y+1 行,执行代价比随机算法 1 的代价要高
The text was updated successfully, but these errors were encountered: