我想优化我的查询,所以我调查一下mysql-slow.log.
我的大多数慢查询包含ORDER BY RAND().我无法找到解决此问题的真正解决方案.Theres是MySQLPerformanceBlog的可能解决方案,但我认为这还不够.在未经优化(或经常更新,用户管理)的表上,它不起作用,或者我需要运行两个或更多查询才能选择我PHP生成的随机行.
这个问题有什么解决方案吗?
一个虚拟的例子:
SELECT accomodation.ac_id,
accomodation.ac_status,
accomodation.ac_name,
accomodation.ac_status,
accomodation.ac_images
FROM accomodation, accomodation_category
WHERE accomodation.ac_status != 'draft'
AND accomodation.ac_category = accomodation_category.acat_id
AND accomodation_category.acat_slug != 'vendeglatohely'
AND ac_images != 'b:0;'
ORDER BY
RAND()
LIMIT 1
Run Code Online (Sandbox Code Playgroud) 从大型mysql表中选择随机行的快速方法是什么?
我在php工作,但我对任何解决方案感兴趣,即使它是用另一种语言.
可能重复:
从mysql中的大表中快速选择随机行
我已经看到使用这样的查询拉取随机行,这对于大型数据集来说效率很低.
SELECT id FROM table ORDER BY RANDOM() LIMIT 1
Run Code Online (Sandbox Code Playgroud)
我还看到了其他各种与MySQL无关的RDBMS特定解决方案.
我能想到的最好的事情就是使用两个查询并执行类似的操作.
这是SQL:
SELECT COUNT(*) FROM table;
SELECT id FROM table LIMIT randnum, 1;
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的主意?
所以我有一个包含超过80,000条记录的表,这一条称为系统.我还有另一个名为follow的表.
我需要我的语句从系统表中随机选择记录,其中该id尚未列在当前用户标识下的下表中.
所以这就是我所拥有的:
SELECT system.id,
system.username,
system.password,
system.followed,
system.isvalid,
follows.userid,
follows.systemid
FROM system
LEFT JOIN follows ON system.id = follows.systemid
AND follows.userid = 2
WHERE system.followed = 0
AND system.isvalid = 1
AND follows.systemid IS NULL
ORDER BY RAND()
LIMIT 200
Run Code Online (Sandbox Code Playgroud)
现在它完美无瑕,除了它需要大约一分钟才能开始处理他们所选择的记录.到这个时候,脚本通常会超时并且没有任何反应.
有人可以告诉我如何重做这个,所以同样的想法已经完成,但它没有使用兰德的命令?这似乎减慢了一大堆.
谢谢!
我目前有一个查询结束,ORDER BY RAND(HOUR(NOW())) LIMIT 40以获得40个随机结果.结果列表每小时更改一次.
这会终止查询缓存,这会破坏性能.
你能否建议另一种方法来获得随时变化的随机(ish)结果集?它不一定是每个小时,也不一定是完全随机的.
我更喜欢随机结果,而不是在表格中的任意字段上排序,但我会这样做作为最后的手段......
(这是我想要随时改变的新产品列表).
这是mysql表中的一些示例数据
a b distance
15 44 250
94 31 250
30 41 250
6 1 250
95 18 250
72 84 500
14 23 500
55 24 500
95 8 500
59 25 500
40 73 500
65 85 500
32 50 500
31 39 500
22 25 500
37 11 750
98 39 750
15 57 750
9 22 750
14 44 750
69 22 750
62 50 750
89 35 750
67 65 750
74 37 750
52 …Run Code Online (Sandbox Code Playgroud) 哪个更有效(管理超过100K记录时):
A. Mysql
SELECT * FROM user ORDER BY RAND();
Run Code Online (Sandbox Code Playgroud)
当然,之后我已经拥有该记录的所有字段.
B. PHP
使用memcached让$ cache_array保存"SELECT id_user FROM user ORDER BY id_user"中的所有数据1小时左右......然后:
$ id = array_rand($ cache_array);
当然,之后我必须通过以下方式进行MYSQL调用:
SELECT * FROM user WHERE id_user = $id;
Run Code Online (Sandbox Code Playgroud)
所以...哪个更有效率?A还是B?
我的架构看起来像这样:
CREATE TABLE users
(
id int auto_increment primary key,
name varchar(20),
point int(255)
);
INSERT INTO users
(name, point)
VALUES
('Jack', 1),
('Rick', 5),
('Danny', 11),
('Anthony', 24),
('Barla', 3),
('James', 15),
('Melvin', 12),
('Orthon', 5),
('Kenny', 2),
('Smith', 30),
('Steven', 27),
('Darly', 45),
('Peter', 44),
('Parker', 66),
('Lola', 78),
('Jennifer', 94),
('Smart', 87),
('Jin', 64),
('David', 31),
('Jill', 78),
('Ken', 48),
('Martin', 19),
('Adrian', 20),
('Oliver', 16),
('Ben', 100);
Run Code Online (Sandbox Code Playgroud)
我的sql是:
select id, name, point from users Order by …Run Code Online (Sandbox Code Playgroud) 嘿大家,我不太确定如何以谷歌搜索的形式描述这个,所以我决定来这里看你们是否可以提供帮助.基本上,我想知道如何将以下伪sql转换为实际的mysql查询:
Select one random row
from `posts`
where (the user's id, which is supplied by the script) is not found in the `votes` table
with a post id of (the selected post's id).
Run Code Online (Sandbox Code Playgroud)
如果你能提供帮助,非常感谢你.
我有一个查询,在数据库中选择6个名称.例如
SELECT names FROM users LIMIT 6
Run Code Online (Sandbox Code Playgroud)
现在我希望这个查询在数据库表中选择一个随机的6个名字,这可能吗?如何
我有一个包含四列的MySQL表submited_name, submited_URL, submited_type, uniqueID.在这张表中我有大约1000条记录.我需要选择10个随机条目.问题是我需要将选定的随机值拆分为单独的PHP数组.每列一个.我的数组看起来像这样:
$ten_random_names = array ('name26', 'name55', 'name107', ect.);
$ten_random_URL = array ('url for name26', 'url for name55', 'url for name107', ect..);
$ten_random_types = array ('type for name26', 'type for name55', 'type for name107', ect..);
Run Code Online (Sandbox Code Playgroud)