小编jac*_*ouh的帖子

如何通过单个查询快速从一个30k的MySQL表中选择3个随机记录?

嗯,这是一个非常古老的问题,从未得到真正的解决方案.我们想要一个表中有3个随机行,大约有30k记录.从MySQL的角度来看,这个表并不是很大,但如果它代表了商店的产品,那么它就具有代表性.例如,当在网页中呈现3个随机产品时,随机选择是有用的.我们想要一个满足以下条件的SQL字符串解决方案:

  1. 在PHP中,PDO或MySQLi的记录集必须正好有3行.
  2. 它们必须通过单个MySQL查询获得,而不使用存储过程.
  3. 解决方案必须很快,例如繁忙的apache2服务器,MySQL查询在很多情况下都是瓶颈.所以它必须避免临时表创建等.
  4. 3条记录必须不是连续的,即它们不得彼此相邻.

该表包含以下字段:

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的条件.

寻求完美,我们首先抛开存在缺陷的现有解决方案:


I. 使用ORDER BY RAND()的这个基本解决方案,

太慢但在每个查询中保证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秒.如此糟糕的表现,避免网页不是吗?


II.使用JOIN ... RAND()的riedsio的明亮解决方案,

MySQL中选择快速600K行的10个随机行,此处适用仅对单个随机记录有效,因为以下查询会产生几乎总是连续的记录.实际上,它只能在ID中随机获得3个连续记录:

SELECT Products.ID, Products.Name
FROM Products
INNER …
Run Code Online (Sandbox Code Playgroud)

php mysql random performance

19
推荐指数
1
解决办法
1万
查看次数

如何使passthrough/passthru查询可编辑?

在带有SQL Server后端的Microsoft Access 2007中,我们通常将SQL Server中的链接表作为可编辑表单的Form.RecordSource用于单个表数据修改.本地查询用于组合来自多个链接表的字段的交叉表版本.本地查询本身必须是可更新的,以便修改编辑表单上的数据.

现在我们计划通过Passthrough查询替换所有本地查询,以便直接使用本机SQL Server表.

我尝试使用以下SQL字符串创建一个名为qrySelProductsPassThroughEditable的非常简单的passthru查询:

SELECT dbo.Products.ID, dbo.Products.Name FROM dbo.Products;
Run Code Online (Sandbox Code Playgroud)

ID字段是在SQL Server中定义为主键的IDENTITY字段作为定义:

CREATE TABLE [dbo].[Products](
    [ID] [int] IDENTITY(1,1) NOT NULL,
        ....
)
Run Code Online (Sandbox Code Playgroud)

但Access传递查询返回的数据表根本不可编辑.所以它不能用作.RecordSource来编辑表单.

这与链接相反,该链接表示如果passthru查询包含所有相关表的所有主键,则查询将是可编辑的.

结论添加了一个后验

通过下面的讨论,Microsoft Access 2007 .accdb,.accde或.accdr(Access运行时)中的直通查询始终是只读的,它永远不可编辑.您应该将它用作最终列表,或者作为报表的.RecordSource,而不是用于必须使用链接表的表单,或者是涉及数据IO的链接表的可写普通查询.

sql-server ms-access ms-access-2007 passthru pass-through

6
推荐指数
2
解决办法
2万
查看次数

如何在不重启MySQL的情况下降低MySQL内存使用率

MySQL 5.1.63在Debian Sqeeze OS中占用了越来越多的内存.

这是我的最高输出:

在此输入图像描述

目前MySQLd使用732Mb驻留内存(RES列),VIRT 855M.但它在两天前从大约330Mb的RAM开始.

不幸的是,有一天它通过一些未经识别的错误查询达到1.2G的峰值,并且永远不会下降......导致服务器关闭.

I tried the following stuffs to lower the VIRT (virtual memory) and RES (Resident RAM) using mysql console, without restarting the MySQLd server, but no success:

mysql> FLUSH TABLES;

mysql> FLUSH QUERY CACHE;

mysql> RESET QUERY CACHE;
Run Code Online (Sandbox Code Playgroud)

The MySQL RAM usage remains 732m.

Any idea ?

mysql memory flush

5
推荐指数
1
解决办法
4879
查看次数