嗯,这是一个非常古老的问题,从未得到真正的解决方案.我们想要一个表中有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) 在带有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的链接表的可写普通查询.
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 ×2
flush ×1
memory ×1
ms-access ×1
pass-through ×1
passthru ×1
performance ×1
php ×1
random ×1
sql-server ×1