Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 帮助我优化随机记录的查询_Mysql_Sql - Fatal编程技术网

Mysql 帮助我优化随机记录的查询

Mysql 帮助我优化随机记录的查询,mysql,sql,Mysql,Sql,我目前有一个随机记录查询,效率非常低,因为它是按RAND()排序的,每次调用时都会创建一个临时表。而且,这意味着它不能被缓存。它还连接到另一个表,这会增加处理时间并使事情稍微复杂化。因此,请帮助我优化以下内容: SELECT listings.id, listings.price, listings.seller_id, sellers.blacklisted FROM listings INNER JOIN sellers ON sellers.id = listings.

我目前有一个随机记录查询,效率非常低,因为它是按RAND()排序的,每次调用时都会创建一个临时表。而且,这意味着它不能被缓存。它还连接到另一个表,这会增加处理时间并使事情稍微复杂化。因此,请帮助我优化以下内容:

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
ORDER BY   RAND()
LIMIT 4
开始执行此操作的一种方法是运行一个查询,返回可能列表的COUNT(),然后运行第二个查询(如果是真正随机的,则为4个其他查询),并在RAND()*COUNT中设置偏移量


您将如何处理此问题?

假设
清单
是根据id编制索引的:

如果您的id是整数:

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CEIL(RAND() * 100),'%')
LIMIT 4
如果是ascii码呢

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CHAR(CEIL(RAND() * 100)),'%')
LIMIT 4
基本上,我的建议是加快速度,把订单交给我。在任何超过几条记录的情况下,都会增加可测量的开销


ps如果在mqsql中不能以这种方式使用concat,请原谅我;不完全确定它是否会工作。

假设
列表
根据id编制索引:

如果您的id是整数:

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CEIL(RAND() * 100),'%')
LIMIT 4
如果是ascii码呢

SELECT     listings.id, listings.price, listings.seller_id, sellers.blacklisted
FROM       listings
INNER JOIN sellers ON sellers.id = listings.sellers_id
WHERE      listings.price > 100
AND        sellers.blacklisted = 0
AND        listings.ID LIKE CONCAT(CHAR(CEIL(RAND() * 100)),'%')
LIMIT 4
基本上,我的建议是加快速度,把订单交给我。在任何超过几条记录的情况下,都会增加可测量的开销


ps如果在mqsql中不能以这种方式使用concat,请原谅我;不完全确定它是否会工作。

那么如何缓存随机记录?这是如何创建临时表的?随机选择不能完全缓存,但是,上面的语句将选择所有10000个列表,然后对它们进行随机排序,然后将其限制为4条记录。效率极低。我觉得可以缓存一些东西:1)计数以获取在SELECT WHERE listings.id=RAND()*MAX中使用的列表总数2)也许有一种方法可以创建一个包含所有具有该连接和WHERE条件的列表的缓存表。那么所需要的就是在该表中为随机id选择一个SELECT。那么如何缓存随机记录呢?这是如何创建一个临时表的呢?随机选择不能完全缓存,但是,上面的语句将选择所有10000个列表,然后对它们进行随机排序,然后将其限制为4个记录。效率极低。我觉得可以缓存一些东西:1)计数以获取在SELECT WHERE listings.id=RAND()*MAX中使用的列表总数2)也许有一种方法可以创建一个包含所有具有该连接和WHERE条件的列表的缓存表。那么所需要的就是在该表中为随机id选择一个更好的整数
RAND()
,在id上?@Gustav,不知道!Rand()给出一个介于0和1之间的数字;我只是给了随机数一个机会。这并不重要;只要你能及时把订单处理掉。我试图强制对主键进行范围扫描(我猜),以加快速度。这是一种方法。我的意思是如果ID是一个整数而不是varchar。如果你知道总是有>100条记录,但也不会从所有可能的记录中进行选择,那么这就可以了。我想您可以在该语句之前选择一个“SELECT COUNT()”,以获得最大值,然后用结果替换*100。最好对ID执行整数
RAND()
?@Gustav,不知道!Rand()给出一个介于0和1之间的数字;我只是给了随机数一个机会。这并不重要;只要你能及时把订单处理掉。我试图强制对主键进行范围扫描(我猜),以加快速度。这是一种方法。我的意思是如果ID是一个整数而不是varchar。如果你知道总是有>100条记录,但也不会从所有可能的记录中进行选择,那么这就可以了。我想您可以在该语句之前使用“SELECT COUNT()”来获取最大值,然后用结果替换*100。