英文网站的首页怎么做大连建设网煤气查询
英文网站的首页怎么做,大连建设网煤气查询,网站是如何建立的,上海企业网站制作报价如何正确的显示随机信息#xff1f;
我们来模拟在英语单词app当中随机出现三个英语单词的情况#xff0c;我们首先创建一张表words#xff0c;然后给这个表当中插入10000条信息进行量化。
select word from words order by rand() limit 3#xff1b;
order by rand
我们来模拟在英语单词app当中随机出现三个英语单词的情况我们首先创建一张表words然后给这个表当中插入10000条信息进行量化。
select word from words order by rand() limit 3
order by rand就是随机取三个的意思接着我们使用Explain语句来看看这个命令发现他要进行排列而且要创建临时表对于优化器来说是处理的行数越少越好就使用了rowid排序进行rowid排序https://blog.csdn.net/Cobrander2_0/article/details/134861949https://blog.csdn.net/Cobrander2_0/article/details/134861949就是先创建一张临时表出来从words表当中按照主键顺序取出主键然后使用rand对每一个主键进行操作得到他们特有的数字存入到临时表当中现在这个临时表当中存在10000条数据了然后初始化sort_buffer将这个数字和主键存入这个过程当中遍历了一遍临时表扫描行数变成20000接着在sort_buffer当中对数字进行排序然后输出前三个扫描行数变成了20003。
在这个过程当中生成了临时表并且表排序的时候使用了rowid方法。
那么是不是所有的临时表都是内存表其实不然tmp_table_size限制了内存临时表的大小当超过他的大小限制的时候就会转化为磁盘临时表当变为磁盘临时表的时候执行上面的语句也会变得不一样我们会发现它使用的临时文件变为0了这是因为他并没有使用并归排序算法而是优先队列排序算法。
优先队列排序
我们现在的SQL语句是需要三个值的但是我们对全表都进行了排序这浪费了很多的计算量而优先队列算法可以精确的只得到三个值简单的来说就是使用了堆取出10000行的前三行构成一个堆然后取出下一行与这个堆里面的最大值进行比较如果下一行的值小于这个堆里面的最大值就对他进行替换接着重复这一步直到结尾。
但是为什么我们上面的语句并没有使用到优先队列排序呢这是因为使用这个算法的话对堆维护的大小就是10000行的namerowid超出了设置的sort_buffer_size值所以只能使用rowid算法。
总之不管使用什么类型的临时表order by rand这个写法都耗费了巨大的资源。
那么有没有什么方法可以让耗费的资源变小呢
随机排序方法
mysql select count(*) into C from t;
set Y floor(C * rand());
set sql concat(select * from t limit , Y, ,1);
prepare stmt from sql;
execute stmt;
DEALLOCATE prepare stmt;
我们首先使用count*来将这个表当中的行数C确定下来接着使用floor和rand方法取出来一个随机的0~C的整数Y然后使用concat是一个字符串连接函数用于将多个字符串合并成一个字符串将Y行当中的信息取出并输出这个句子的意思是构建一个SQL查询该查询从表 t 中选取一定数量的行。Y 变量决定了从哪一行开始选取。
MySQL处理limit Y,1 的做法就是按顺序一个一个地读出来丢掉前Y个然后把下一个记录作为返回结果因此这一步需要扫描Y1行。再加上第一步扫描的C行总共需要扫描CY1行。这个代价是要小于前面的order by rand语句的。
prepare stmt from sql;
这段代码的目的是从 sql 变量中获取SQL查询字符串并准备一个预处理语句。预处理语句是一种优化的方式用于执行相同的SQL查询多次而不需要每次都重新解析和编译查询。这样可以提高执行效率。
在准备好预处理语句后可以使用 execute stmt 命令来执行它。执行完毕后使用 deallocate prepare stmt 命令来释放预处理语句。
如果要输出三个单词就找到三个Y值然后在表当中取出这个Y行接着使用concat进行拼接后输出。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90358.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!