我想优化我的查询,所以我调查一下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表,里面有一堆条目,还有一个名为"Multiplier"的列.此列的默认(和最常见)值为0,但可以是任何数字.
我需要做的是随机从该表中选择一个条目.但是,行根据"乘数"列中的数字进行加权.值为0意味着它根本没有加权.值为1意味着它的加权值是两倍,就像条目在表中两次一样.值为2意味着它的加权值是其三倍,就像条目在表中三次一样.
我正在尝试修改我的开发人员已经给我的内容,很抱歉,如果设置没有多大意义.我可能会改变它,但希望保留尽可能多的现有表格设置.
我一直试图弄清楚如何使用SELECT和RAND(),但不知道如何进行加权.可能吗?
以下是我在数据库中查询某些单词的方法
$query = $qb->select('w')
->from('DbEntities\Entity\Word', 'w')
->where('w.indictionary = 0 AND w.frequency > 3')
->orderBy('w.frequency', 'DESC')
->getQuery()
->setMaxResults(100);
Run Code Online (Sandbox Code Playgroud)
我正在使用mysql,我想获得符合条件的随机行,我会在查询中使用rand()命令.
我发现这个类似的问题基本上表明,因为在学说中不支持ORDER BY RAND,你可以随机化主键.但是,这不能在我的情况下完成,因为我有一个搜索条件和一个where子句,以便不是每个主键都满足该条件.
我还发现了一个代码片段,建议你使用OFFSET随机化行,如下所示:
$userCount = Doctrine::getTable('User')
->createQuery()
->select('count(*)')
->fetchOne(array(), Doctrine::HYDRATE_NONE);
$user = Doctrine::getTable('User')
->createQuery()
->limit(1)
->offset(rand(0, $userCount[0] - 1))
->fetchOne();
Run Code Online (Sandbox Code Playgroud)
我有点困惑的是,这是否会帮助我解决在我的情况下随机缺乏对订单的支持.我无法在setMaxResult之后添加偏移量.
知道如何实现这一目标吗?
嗯,这是一个非常古老的问题,从未得到真正的解决方案.我们想要一个表中有3个随机行,大约有30k记录.从MySQL的角度来看,这个表并不是很大,但如果它代表了商店的产品,那么它就具有代表性.例如,当在网页中呈现3个随机产品时,随机选择是有用的.我们想要一个满足以下条件的SQL字符串解决方案:
该表包含以下字段:
CREATE TABLE Products (
ID INT(8) NOT NULL AUTO_INCREMENT,
Name VARCHAR(255) default NULL,
HasImages INT default 0,
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
WHERE约束是Products.HasImages = 1,仅允许获取具有可在网页上显示的图像的记录.大约三分之一的记录符合HasImages = 1的条件.
寻求完美,我们首先抛开存在缺陷的现有解决方案:
太慢但在每个查询中保证3个真正随机的记录:
SELECT ID, Name FROM Products WHERE HasImages=1 ORDER BY RAND() LIMIT 3;
Run Code Online (Sandbox Code Playgroud)
*CPU约0.10s,因WHERE子句扫描9690行,使用where; 使用临时; 在Debian Squeeze双核Linux机器上使用filesort,并不是那么糟糕
因为使用临时表和filesort而不能扩展到更大的表,并且在测试Windows7 :: MySQL系统上的第一个查询需要8.52秒.如此糟糕的表现,避免网页不是吗?
从MySQL中选择快速600K行的10个随机行,此处适用仅对单个随机记录有效,因为以下查询会产生几乎总是连续的记录.实际上,它只能在ID中随机获得3个连续记录:
SELECT Products.ID, Products.Name
FROM Products
INNER …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何从条件实例中获取n个随机行:
Criteria criteria = session.createCriteria(Table.class);
criteria.add(Restrictions.eq('fieldVariable', anyValue));
...
Run Code Online (Sandbox Code Playgroud)
那又怎样?我找不到任何带有Criteria API的文档
这是否意味着我应该使用HQL?
感谢名单!
编辑:我得到的行数:
int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult();
Run Code Online (Sandbox Code Playgroud)
如何获取索引在0到最大值之间的n个随机行?再次!
可能重复:
在MySQL中选择随机行
我正在使用PHP和MySQL创建一个简单的Web应用程序.在其中,我需要以随机顺序从表中随机选择一小组行.我如何使用MySQL实现这样的功能?
我正在开发一个测验网站,我有一个存储所有问题的数据库.有不同类型的测验,如数学,科学,历史等.所有问题都存储在一个表中.
我的问题表看起来像这样:
questions ( qno(int) ,type(int), question, .... ,... )
Run Code Online (Sandbox Code Playgroud)
qno是主键,type用于跟踪测验类型:
if type = 1 (math)
type = 2(science)
Run Code Online (Sandbox Code Playgroud)
现在,我想为每种类型的测试选择一些随机问题.例如,我可能只想为数学测试选择一些随机的20个问题.
MySQL有某种方法可以选择随机行吗?
ORDER BY rand()与其他解决方案相比,性能是否真的很慢?如果是,有什么更好的方法从数据库中选择随机行?
我的查询:
SELECT sName FROM bpoint WHERE placeID=? ORDER BY rand() LIMIT 1;
Run Code Online (Sandbox Code Playgroud) mysql ×8
random ×6
php ×5
sql ×5
performance ×2
select ×2
doctrine-orm ×1
dql ×1
hibernate ×1
java ×1