mysql 随机获取记录 order by rand 优化
如果要随机获取记录数,在mysql里最简单的方法肯定是order
by
rand
()了,但是这种方法只能在表记录极少的情况下才能使用。主要是因为order
by
rand
()导致了using filesort.这个时候查询类型会变成all,索引会失效。只需简单的变通下,完成可以做到同样的效果。
根据记录的类型,分类连续和非连续两种。
连续指记录是连续存放的,并且有字段可以证明记录是连续的,例如自增id。
非连续是指记录是随机存放的,例如有条件的查询,结果肯定不是连续的。
一、连续记录优化
先得到表的最大id和最小id。select max(id),min(id) from table
1.在程序里随机一个在最大id和最小id的中间数,查询的时候大于这个随机数的就是随机记录了。
Sql代码
select
*
from
table
where
id > 中间数 limit length;
select * from table where id > 中间数 limit length;
缺点:如果中间数很大的话,获取不了需要的记录数,随机性不强
2.在程序里随机n个最大id和最小id的中间数,查询的时候用in获得这几个中间数的记录
Sql代码
select
*
from
table
where
id
in
(中间数1, 中间数2,中间数3)
select * from table where id in (中间数1, 中间数2,中间数3)
需要注意的是,如果你要获取5条记录,那建议随机10个数。
缺点:性能不如第1种方法,但是随机性更强
二、非连续记录优化
其实非连续记录的方法一样可以应用在连续记录中。
首先获得记录的总数,例如:select count(*) from table where groupid = 1;
然后在程序里随机n个小于记录总数的中间数,之后通过循环
Sql代码
select
*
from
table
where
groupid = 1 limit 中间数,1
select * from table where groupid = 1 limit 中间数,1
来获得记录。
关于优化循环sql可以采用prepare或者union all来优化循环执行
关于第三种方法利用limit达到随机的效果,我拿了点数据测试。
总记录:175,410 条件记录:20,946
order
by
rand
Sql代码
SELECT
*
from
Member
WHERE
Country =
"HK"
ORDER
BY
RAND
() limit 30
SELECT
相关文档:
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令。包括查看 MySQL 数据库服务器字符集、查看 MySQL 数据库字符集,以及数据表和字段的字符集、当前安装的 MySQL 所支持的字符集等。
一、查看 MySQL 数据库服务器和数据库字符集。
mysql> show variables like '%char%';
+-- ......
问题是这样的:在插入一行数据前就想要知道将要产生的id。比如说想用来命名上传的文件。如果不事先获得id就不知道文件名,就没法在插入时把文件路径保存到数据库里了。如果不需要事先获得id,大可以在插入后调用mysql_insert_id()或者执行select last_insert_id(),就不必往下看了。为了照顾性急的同学,先给答案:
$resul ......
在VC6中使用c API方式连接MySQL数据库
一、环境配置
1、在MySql的官方网站下载mysql-connector-c-noinstall,并将解压后的bin和include文件夹拷贝到Mysql的安装目录
2、设置VC6环境,在vc工具-选项-目录,加入刚才的Include文件夹的路径,例如:C:\Program Files\MySQL\MySQL Server 5.1\include
二、工程设置
3、将li ......
近日,MySQL 5.5 第一个版本发布了,基于MySQl 5.4,但是在性能上相对于当前的5.0/5.1有了很大的提升。
新特性:
支持semisynchronous (半同步)复制接口,可搭建出一个相对完美的MySQL高可用性方案
集成Innodb plugin 1.0.6
支持 SQL 标准 SIGNAL 和 RESIGNAL 语句
增强XML功能,支持 LOAD XML 语句
可通过 A ......
首先看MySQL 5.0参考手册中关于创建存储过程的语法说明:
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | ......