mysql order 随机,mysql 随机获取记录 order by rand 优化

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

相关文档:

主要的程序:

package greeds.jdbc.sample;

import greeds.jdbc.util.JDBCUtil;

import java.io.*;

import java.sql.*;

public class MySQLBlobSample {

public static void main(String[] args) throws Exception {

// 写入数据库

/*

*

* Connection ......

Mysql my.ini 配置文件详解

#BEGIN CONFIG INFO

#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大

#TYPE: SYSTEM

#END CONFIG INFO

#

# 此mysql配置文件例子针对4G内存

# 主要使用INNODB

#处理复杂队列并且连接数量较少的mysql服务器

#

# 将此文件复制到/etc/my.cnf 作为全局设置,

# mysql-data-d ......

Mysql Explain 详解

一.语法

explain < table_name >

例如: explain select * from t3 where id=3952602;

二.explain输出解释

+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

| id | select_type | table | type  | possible_keys  &nb ......

130 :文件格式不正确。(还不是很清楚错误的状况)

145  :文件无法打开。

1005:创建表失败。

1006:创建数据库失败。

1007:数据库已存在,创建数据库失败。

1008:数据库不存在,删除数据库失败。

1009:不能删除数据库文件导致删除数据库失败。

1010:不能删除数据目录导致删除数据库失败。

1011:� ......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值