mysql 数据信息库查寻任意总数内容的高效率难题

2021-03-17 10:41 jianzhan
Transact-SQL 适用用以查寻 xml 数据信息种类的 XQuery 語言的非空子集。此 XQuery 完成合乎 2004 年 7 月的 XQuery 工作中议案。该語言已经由 World Wide Web 协同会 (W3C) 开发设计,全部关键数据信息库供货商和 Microsoft 也参加此开发设计。因为 W3C 标准在变成 W3C 提议以前还将会开展修

mysql 数据信息库查寻任意总数内容的高效率难题及处理方法

近期因为必须大约科学研究了一下MYSQL的任意提取完成方式。举个案子,要从tablename表格中任意获取一条纪录,大伙儿一一样的书写便是:SELECT*FROM tablename ORDER BY RAND()LIMIT1。

可是,之后我查了一下MYSQL的官方网指南,里边对于RAND()的提醒大约含意便是,在ORDER BY从句里边不可以应用RAND()涵数,由于那样会造成数据信息列被数次扫描仪。可是在MYSQL3.23版本号中,依然能够根据ORDER BY RAND()来完成任意。

可是真实检测一下才发觉那样高效率十分低。一个十五万余条的库,查寻5总数据,竟然要8秒之上。查询官方网指南,也说rand()放到ORDER BY子句时会强制执行数次,当然高效率及很低。

检索Google,在网上大部分全是查寻max(id)*rand()来任意获得数据信息。

SELECT*FROM`table`AS t1JOIN(SELECT ROUND(RAND()*(SELECT MAX(id)FROM`table`))AS id)AS t2WHERE t1.id =t2.id ORDER BY t1.id ASC LIMIT5;

可是那样会造成持续的5条纪录。处理方法只有是每一次查寻一条,查寻5次。就算这般也非常值得,由于十五万条的表,查寻只必须0.0一秒不上。

下边的句子选用的是JOIN,mysql的社区论坛上面有人应用

SELECT*FROM`table`WHERE id =(SELECT FLOOR(MAX(id)*RAND())FROM`table`)ORDER BY id LIMIT1;

我检测了一下,必须0.5秒,速率都不错,可是紧跟面的句子還是有非常大差别。总觉有哪些地区歪斜常。

因此我将句子改变了一下。

SELECT*FROM`table`

WHERE id =(SELECT floor(RAND()*(SELECT MAX(id)FROM`table`)))

ORDER BY id LIMIT1;

这下,高效率又提升了,查寻時间仅有0.0一秒

最终,再把句子健全一下,再加MIN(id)的分辨。我还在最初检测的情况下,便是由于沒有再加MIN(id)的分辨,結果有一半的時间一直查寻到表格中的前边几行。

详细查寻句子是:

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 LIMIT1;

SELECT*

FROM`table`AS t1JOIN(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 LIMIT1;

最终在php中对这2个句子开展各自查寻10次,

前面一种花销時间0.147433秒

后面一种花销時间0.015130秒

来看选用JOIN的英语的语法比立即在WHERE中应用涵数高效率也要高许多。

共享到:
文中"mysql 数据信息库查寻任意总数内容的高效率难题及处理方法"由远航网站站长搜集梳理而成,仅作大伙儿学习培训与参照应用。大量网站建设实例教程尽在远航网站站长站。