每当用户更新他的个人资料时,我们都会进行一组查询,如下所示:
DELETE FROM `user_likes` WHERE `ID` = $id
INSERT INTO `user_likes` VALUES (DEFAULT, $id, $interest_id, $interest_name)
Run Code Online (Sandbox Code Playgroud)
有没有办法一步完成这一切?必须有办法,因为每个用户的兴趣 ID 都是不同的。请记住,实际上永远不必删除数据——它是一个一直在增长的集合。
我有一个大约 700k 行的表,每行都由一个唯一的 itemnumber 标识。
通过计算指示关联强度的单个数值或两个项目之间的数学“距离”,每行/项目可以与表中的任何其他行/项目相关联,没有关联/无限距离由“0”表示" 而数值“1”表示相同项目/无距离。
这些关联编号难以计算/计算密集并且基于存储在单独数据库中的数据。因此,为所有行组合预先计算一次,然后只为添加的新行(每年 <4k 新行)预先计算它们似乎是有道理的。
生成的关联表可能如下所示:
itemnumber | associatedwithitem | associationstrength
23920390293 | 12356456885 | 0.12255888644888
45468411516 | 44565464884 | 0.91155684161123
45648855222 | 98956221818 | 0.00000000000000
45468411516 | 23920390293 | 0.46813185844468
Run Code Online (Sandbox Code Playgroud)
然而,这样一个表的大小将是巨大的:((700,000 x 700,000) - 700,000)/2 = 244.999.650.000 = 大约 2500 亿行,即使在丢弃所有自连接(公式中的 -700,000)并存储之后每个连接只有一种方式(公式中除以二)。
我将只运行一种类型的查询,如下所示:
“给定一个 itemnumber 列表(见上表示例),计算平均(mean)关联数。”
针对关联表运行的每个 itemnumber 列表通常包含 < 1k itemnumber,但很少会大到 50k。但是因为 1k 个 itemnumber 的列表中的每个数字都将与 700k 个其他 itemnumber 相关联,这样的查询将提取 700,000 x 1000 = 700,000,000 个关联号,然后需要计算这 700m 个关联号的平均值。
对以下方面的任何想法:
磁盘可以维持的平均每秒输入/输出操作是调优 MySQL / InnoDB 数据库的一个非常重要的因素,因为它推动了脏 InnoDB 缓冲池页面刷新回磁盘的速度。
有没有一种方法或公式可以用来估计我的 RAID 10 磁盘阵列可以运行的每秒平均 I/O 操作数?
在查看pl/pythonand 的几个示例时pl/pgsql,我看到许多(但不是全部)使用volatile cost.
IE:
CREATE OR REPLACE FUNCTION my_function()
RETURNS setof record AS
$BODY$
-- code
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Run Code Online (Sandbox Code Playgroud)
搜索有关volatile cost我的更多信息时发现(乍一看)大约至少 90% 的网络示例都在使用volatile cost 100,有时有时会使用volatile cost 1。(因为rows它是 1000)。
据我了解,此指示有助于查询计划优化器决定如何在短路布尔运算中设置优先级。
如果我开始给出估计值cost或rows对我的每个存储过程进行估计,是否过早优化?我应该只在我想优化某些查询时才这样做吗?选择成本的良好价值是一门艺术吗?
我知道命令explain,我还没有学会。这个命令对估计有帮助cost吗?
我最近开始研究PostgreSQL,我有大约1200 万行要处理,我想在其中应用Full Text Search。我之前没有处理此类数据库的任何经验。我已尝试优化查询,但我怀疑它是否已完全优化。
现在我正在使用GIST 索引,因为我读到GIN 索引中的更新速度较慢,并且我的数据库将定期更新。
我现在只需要关注数据库的两列merchant varchar(80)和product varchar(400).
我需要使用 FTS 查找产品,并且即使商家拼写错误,我也正在尝试获取该产品。
我在大约30K行的示例数据库上运行了一些查询,以获得以下结果:
首先,我运行基本的 FTS 查询来分析结果。
explain analyze
select count(*) from products
where to_tsvector('english', product) @@ to_tsquery('hat');
Run Code Online (Sandbox Code Playgroud)Run Code Online (Sandbox Code Playgroud)Aggregate (cost=2027.27..2027.28 rows=1 width=0) (actual time=349.032..349.032 rows=1 loops=1) -> Seq Scan on products (cost=0.00..2026.90 rows=147 width=0) (actual time=43.322..348.961 rows=307 loops=1) Filter: (to_tsvector((product)::text) @@ to_tsquery('hat'::text)) Total runtime: 349.140 ms
然后我创建了 GIST 索引并运行相同的查询以查看改进。结果非常好。至少对于我来说。
create index product_gist on products …Run Code Online (Sandbox Code Playgroud)postgresql index optimization full-text-search pattern-matching
我实际上有几个问题。
首先,我找到了这个关于优化的信息:https : //stackoverflow.com/questions/5474662/mysql-optimize-all-tables
问题是,我似乎在任何地方都没有 mysqlcheck 程序。我正在使用 MySQL 工作台。我过去可能使用过其他 MySQL 版本。当我查找 mysql 时,我在 Program Files 文件夹中找到了一个 MySQL 文件夹,其中包含一个 MySQL Server 5.5 文件夹。这个有一些 .ini 文件和 bin、dat 等目录,但没有可执行文件。然后在 Program Files (x86) 中有另一个 MySQL 文件夹。其中有几个文件夹,包括:MySQL Documentation 5.5.30、MySQL Installer、MySQL Notifier、MySQL Workbench CE 5.2.47 和 Samples and Examples 5.5.30。唯一具有 mysql.exe 的是 MySQL Workbench CE 5.2.47。但它没有mysqlcheck.exe。
我在 Workbench 中摸索,找不到任何维护或优化功能。
我的数据库是 17 GB,我从大表中删除了一些大文本字段,我希望能恢复空间,因为我的操作系统正在向我大喊要腾出更多空间。Workbench 是否有优化的能力,如果有,我该怎么做?如果没有,我可以安装什么才能做到这一点?
我的系统中有一个非常重要的查询,由于表上的数据量很大,执行时间太长。我是一名初级 DBA,我需要为此进行最佳优化。每个表大约有 8000 万行。
表是:
tb_pd:
Column | Type | Modifiers | Storage | Stats target | Description
---------------------+---------+-----------+---------+--------------+-------------
pd_id | integer | not null | plain | |
st_id | integer | | plain | |
status_id | integer | | plain | |
next_execution_date | bigint | | plain | |
priority | integer | | plain | |
is_active | integer | | plain | |
Indexes:
"pk_pd" PRIMARY KEY, btree (pd_id)
"idx_pd_order" btree (priority, next_execution_date) …Run Code Online (Sandbox Code Playgroud) 我一直在性能故障排除方面苦苦挣扎,包括 SQL 性能的基线和故障排除。
任何人都可以对此提供帮助或指出我可以在哪里获得有关此主题的有用信息?
我希望提高某个程序的性能,我想从插入SET NOCOUNT ON.
我已经阅读了几篇关于这个主题的文章:
SET NOCOUNt ON 提高 SQL Server SP 性能
但我不太明白的是,如果每个程序都需要一次,还是每次“开始/结束”时都需要插入它
例如,在下面的过程中 - 我是否应该插入SET NOCOUNT ON右侧并设置最后一个变量:set @PrintInfo = 'No Trip Number...
或者我是否需要SET NOCOUNT ON在程序中的每个“开始”之后插入:
Create procedure [dbo].SSIS_UpdateDriveResults
(
@RSADriveID nvarchar (50),
@ProcedureID int,
@Registered int,
@Performed int,
...
)
as
set @ResultError = 0
set @ResultMessage = ''
declare @Id int
declare @Name varchar(64)
declare @DriveId int
declare @ErrorMessage nvarchar(255)
...
Set @ExternalIDs = cast(@RSADriveID as nvarchar(50))
set @IsFixedSite = …Run Code Online (Sandbox Code Playgroud) 我正在处理一个使用 MongoDB 的应用程序,该应用程序收到了相当多的传入请求,我注意到响应随着请求数量的增加而变慢。
我怀疑数据库效率低下。我在一个较高负载期间运行了 mongostat,结果似乎表明锁定百分比很高:
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn set repl time
*0 1120 479 *0 179 472|0 0 72.1g 146g 1.31g 0 server-prod:15.7% 0 0|0 1|0 1m 4m 298 rs0 PRI 15:37:28
*0 1192 509 *0 178 428|0 0 72.1g 146g 1.3g 0 server-prod:18.9% 0 0|0 0|0 1m 5m 298 rs0 PRI 15:37:29
*0 1107 456 *0 174 362|0 0 72.1g 146g …Run Code Online (Sandbox Code Playgroud) optimization ×10
performance ×3
postgresql ×3
mysql ×2
sql-server ×2
index ×1
index-tuning ×1
mongodb ×1
schema ×1
storage ×1
tuning ×1
update ×1