MYSQL执行sql语句,批量更改为指定时间段的随机时间

MYSQL执行sql语句,批量更改为指定时间段的随机时间,第1张

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数据,瞬间出结果。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

MySQL

RAND()函数调用可以在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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5902196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存