1、首先打开mysql,连接一个数据库,点击上方的【查询】按钮,再点击【新建查询】,如图所示。
2、在查询框中,输入sql语句“EXPLAIN select * from users”,前面加了EXPLAIN,则查询语句在执行时,会记录执行过程效率。
3、在查询框中,输入sql语句“EXPLAIN select * from users”,前面加了EXPLAIN,则查询语句在执行时,会记录执行过程效率。
4、然后看到结果1那一栏,可以看到,查询的表是【users】,查询类型是【SIMPLE】,type是【all】,因为用了“select *”语句。
5、最后一栏显示的是【状态】,即表示一些执行的状态,如接收到的字节数,值是多少;发送的字节数,值是多少等。
在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。SELECT
*
FROM
table_name
ORDER
BY
rand()
LIMIT
5
rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
mysql>
select
RAND()
->
0.5925
mysql>
select
RAND(20)
->
0.1811
mysql>
select
RAND(20)
->
0.1811
mysql>
select
RAND()
->
0.2079
mysql>
select
RAND()
->
0.7888
你不能在一个ORDER
BY子句用RAND()值使用列,因为ORDER
BY将重复计算列多次。然而在MySQL3.23中,你可以做:
SELECT
*
FROM
table_name
ORDER
BY
RAND(),这是有利于得到一个来自SELECT
*
FROM
table1,table2
WHERE
a=b
AND
c<d
ORDER
BY
RAND()
LIMIT
1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。
网上基本上都是查询max(id)
*
rand()来随机获取数据。
SELECT
*
FROM
`table`
AS
t1
JOIN
(SELECT
ROUND(RAND()
*
(SELECT
MAX(id)
FROM
`table`))
AS
id)
AS
t2
WHERE
t1.id
>=
t2.id
ORDER
BY
t1.id
ASC
LIMIT
5
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是JOIN,mysql的论坛上有人使用
SELECT
*
FROM
`table`
WHERE
id
>=
(SELECT
FLOOR(
MAX(id)
*
RAND())
FROM
`table`
)
ORDER
BY
id
LIMIT
1
我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距
后来请教了baidu,得到如下代码
完整查询语句是:
SELECT
*
FROM
`table`
WHERE
id
>=
(SELECT
floor(
RAND()
*
((SELECT
MAX(id)
FROM
`table`)-(SELECT
MIN(id)
FROM
`table`))
+
(SELECT
MIN(id)
FROM
`table`)))
ORDER
BY
id
LIMIT
1
SELECT
*
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
WHERE
t1.id
>=
t2.id
ORDER
BY
t1.id
LIMIT
1
最后在php中对这两个语句进行分别查询10次,
前者花费时间
0.147433
秒
后者花费时间
0.015130
秒
执行效率需要0.02
sec.可惜的是,只有mysql
4.1.*以上才支持这样的子查询.
注意事项
查看官方手册,也说rand()放在ORDER
BY
子句中会被执行多次,自然效率及很低。
以上的sql语句最后一条,本人实际测试通过,100W数据,瞬间出结果。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
MySQLRAND()函数调用可以在0和1之间产生一个随机数:
mysql>
SELECT
RAND(
),
RAND(
),
RAND(
)
+------------------+-----------------+------------------+
|
RAND(
)
|
RAND(
)
|
RAND(
)
|
+------------------+-----------------+------------------+
|
0.45464584925645
|
0.1824410643265
|
0.54826780459682
|
+------------------+-----------------+------------------+
1
row
in
set
(0.00
sec)
当调用一个整数参数时,RAND()使用该随机数发生器种子值。每次在给定值种子生成,RAND()会产生一个可重复的一系列数字:
mysql>
SELECT
RAND(1),
RAND(
),
RAND(
)
+------------------+------------------+------------------+
|
RAND(1
)
|
RAND(
)
|
RAND(
)
|
+------------------+------------------+------------------+
|
0.18109050223705
|
0.75023211143001
|
0.20788908117254
|
+------------------+------------------+------------------+
1
row
in
set
(0.00
sec)
可以使用ORDER
BY
RAND(),随机组行或值如下:
要了解ORDER
BY
RAND()函数,
假设EMPLOYEE_TBL的表有以下记录:
mysql>
SELECT
*
FROM
employee_tbl
+------+------+------------+--------------------+
|
id
|
name
|
work_date
|
daily_typing_pages
|
+------+------+------------+--------------------+
|
1
|
John
|
2007-01-24
|
250
|
|
2
|
Ram
|
2007-05-27
|
220
|
|
3
|
Jack
|
2007-05-06
|
170
|
|
3
|
Jack
|
2007-04-06
|
100
|
|
4
|
Jill
|
2007-04-06
|
220
|
|
5
|
Zara
|
2007-06-06
|
300
|
|
5
|
Zara
|
2007-02-06
|
350
|
+------+------+------------+--------------------+
7
rows
in
set
(0.00
sec)
现在使用以下目录:
mysql>
SELECT
*
FROM
employee_tbl
ORDER
BY
RAND()
+------+------+------------+--------------------+
|
id
|
name
|
work_date
|
daily_typing_pages
|
+------+------+------------+--------------------+
|
5
|
Zara
|
2007-06-06
|
300
|
|
3
|
Jack
|
2007-04-06
|
100
|
|
3
|
Jack
|
2007-05-06
|
170
|
|
2
|
Ram
|
2007-05-27
|
220
|
|
4
|
Jill
|
2007-04-06
|
220
|
|
5
|
Zara
|
2007-02-06
|
350
|
|
1
|
John
|
2007-01-24
|
250
|
+------+------+------------+--------------------+
7
rows
in
set
(0.01
sec)
mysql>
SELECT
*
FROM
employee_tbl
ORDER
BY
RAND()
+------+------+------------+--------------------+
|
id
|
name
|
work_date
|
daily_typing_pages
|
+------+------+------------+--------------------+
|
5
|
Zara
|
2007-02-06
|
350
|
|
2
|
Ram
|
2007-05-27
|
220
|
|
3
|
Jack
|
2007-04-06
|
100
|
|
1
|
John
|
2007-01-24
|
250
|
|
4
|
Jill
|
2007-04-06
|
220
|
|
3
|
Jack
|
2007-05-06
|
170
|
|
5
|
Zara
|
2007-06-06
|
300
|
+------+------+------------+--------------------+
7
rows
in
set
(0.00
sec)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)