MySQL随机查询记录的效率测试分析

 更新时间:2011年06月24日 22:16:40   作者:  
以下的文章主要介绍的是MySQL使用rand 随机查询记录效率测试,我们大家一直都以为MySQL数据库随机查询的几条数据,就用以下的东东,其实其实际效率是十分低的
以下就是文章的主要内容。
  1.SELECT * FROM `table` ORDER BY RAND() LIMIT 5
  就可以了。
  但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
  查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
  You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
  搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
  1.SELECT *
  2.FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
  3.WHERE t1.id >= t2.id
  4.ORDER BY t1.id ASC LIMIT 5;
  但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
  上面的语句采用的是JOIN,MySQL的论坛上有人MySQL使用
  1.SELECT *
  2.FROM `table`
  3.WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
  4.ORDER BY id LIMIT 1;
  我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
  于是我把语句改写了一下。
  1.SELECT * FROM `table`
  2.WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
  3.ORDER BY id LIMIT 1;
  这下,效率又提高了,查询时间只有0.01秒
  最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
  完整查询语句是:
  1.SELECT * FROM `table`
  2.WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
  3.ORDER BY id LIMIT 1;
  4.SELECT *
  5.FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
  6.WHERE t1.id >= t2.id
  7.ORDER BY t1.id LIMIT 1;
  最后在php中对这两个语句进行分别查询10次,
  前者花费时间 0.147433 秒
  后者花费时间 0.015130 秒
  看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。以上的相关内容就是对MySQL使用rand随机查询记录效率测试的介绍,望你能有所收获。

相关文章

  • mysql大数据查询优化经验分享(推荐)

    mysql大数据查询优化经验分享(推荐)

    这篇文章主要介绍了mysql大数据查询优化经验分享,真的是正儿八经的mysql优化技巧,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • mysql空间函数计算坐标距离方式

    mysql空间函数计算坐标距离方式

    文章介绍了如何使用MySQL的空间函数`st_distance`和`st_distance_sphere`计算两点之间的距离,并对比了两种方法的准确性,`st_distance`函数计算的是两点间的度数,需要乘以111195转换为米,但因每度长度不一致会有误差
    2025-02-02
  • window10中mysql8.0修改端口port不生效的解决方法

    window10中mysql8.0修改端口port不生效的解决方法

    mysql配置文件默认位置,端口号等信息需要在my.ini文件中修改,若修改安装位置的my-default文件文件或新建my.ini文件是不生效的,本文主要介绍了window10中mysql8.0修改端口port不生效的解决方法,感兴趣的可以了解一下
    2023-11-11
  • MySql8.023安装过程图文详解(首次安装)

    MySql8.023安装过程图文详解(首次安装)

    这篇文章主要介绍了MySql8.023安装过程(首次安装),本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • MySQL如何匹配字符串函数

    MySQL如何匹配字符串函数

    MySQL提供多个字符串匹配函数,如like、locate、position、instr和find_in_set,其中locate、position、instr和find_in_set均返回字符在字段中的索引(如果包含),否则返回0,特别地,find_in_set适用于字段为数组的情况
    2024-11-11
  • JDBC-idea导入mysql连接java的jar包(mac)的方法

    JDBC-idea导入mysql连接java的jar包(mac)的方法

    这篇文章主要介绍了JDBC-idea导入mysql连接java的jar包(mac)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • mysql 子查询与连接表详情

    mysql 子查询与连接表详情

    这篇文章主要介绍了mysql 子查询与连接表,格式化SQL 包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此,对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询,下面请跟雄安边一起来看看详细内容吧
    2021-10-10
  • MySQL内部函数的超详细介绍

    MySQL内部函数的超详细介绍

    众所周知MySQL有很多内置的函数,下面这篇文章主要给大家介绍了关于MySQL内部函数的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-08-08
  • 讲解Linux系统下如何自动备份MySQL数据的基本教程

    讲解Linux系统下如何自动备份MySQL数据的基本教程

    这篇文章主要介绍了Linux系统下如何自动备份MySQL数据的基本教程,还给出了利用shell脚本全备份和增量备份的基本方法,需要的朋友可以参考下
    2015-11-11
  • mysql间隙锁的应用

    mysql间隙锁的应用

    本文主要介绍了mysql间隙锁的应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01

最新评论