我刚刚升级到MySQL 5.1.6,以便利用将常规日志保存到表中的能力 - >即mysql.general_log.一旦我这样做,我立即感到惊讶,实际上有多少查询正在触及我们的系统.从第一个小时开始,我在此常规日志表中有大约40,000行.我还没有在MySQL文档中发现它是否存在一般日志表大小限制.
让这个普通日志以这个速度增长是否有问题?
如果有尺寸问题,如何处理?
是否有一些公认的做法如何处理尺寸问题?
我应该制作一个清除表格的事件并经常将数据保存到文件中吗?
非常感谢您的帮助!
我有这样的查询,应该在每个MySQL操作后执行.此查询现在正在减慢页面加载速度,因为数据增加了,我做了所有事情,如正确的索引,但查询仍然相对较慢.
有没有其他方法来执行这些检查?
$query = "
UPDATE {$tprefix}wh_profg
SET status =
CASE
WHEN
batchno in (
select
batchno
from
{$tprefix}wh_profulldetail
where
remainingdays <= 0
)
THEN
'expired'
WHEN
QC = 'rejected' and QA != 'rejected'
and status != 'expired'
THEN
'QC-rejected'
WHEN
QA = 'rejected' and QC != 'rejected'
and status != 'expired'
THEN
'QA-rejected'
WHEN
QA = 'rejected' and QC = 'rejected'
and status != 'expired'
THEN
'QA&QC-rejected'
WHEN
(
batchno in (
select
batchno
from
{$tprefix}wh_profulldetail
where
available <= …Run Code Online (Sandbox Code Playgroud) 询问:
select id, event_time from events where event_time > 1395797406712 and event_time < 1398389406712 order by event_time asc。
此查询返回约 25k 行(总大小 500KB)。
当我使用驱动程序在 Node.js 中查询上述查询时node-mysql,执行大约需要 3-4 秒。(我使用console.time和console.timeEnd)
当我直接在 mySql 中查询它时,它说需要大约 200 毫秒。
是什么造成了这种巨大的差异,以及如何改进 Node.js 实现以与直接 Mysql 查询内联?
我有一个非常简单的查询非常慢.Entity Framework Profiler表示大约需要100毫秒.
dbContext.Users.Single(u => u.Id == userId);
Run Code Online (Sandbox Code Playgroud)
尝试了一下后,我发现了一个非常相似但速度更快的查询(大约3毫秒).
dbContext.Users.Where(u => u.Id == userId).ToList().Single();
Run Code Online (Sandbox Code Playgroud)
当我比较两个查询的sql时,第二个查询不使用嵌套的SELECT而不使用TOP操作.但是我不希望它因为这两件事而快30倍.此外,使用SQL Server Management Studio执行查询时,没有可测量的差异.
当我查看执行计划时,他们都会创建一个具有100%查询成本的聚簇索引查找.而附加select和Top操作的查询成本为0%.来自EFProfiler的查询计划表明它不应该有任何区别.
在这种情况下,我该怎么做才能更好地理解查询性能?
下面是第一个查询的结果SQL.
SELECT [Limit1].[Id] AS [Id],
[Limit1].[EmailAddress] AS [EmailAddress],
[Limit1].[FirstName] AS [FirstName],
[Limit1].[LastName] AS [LastName]
FROM (SELECT TOP (2) [Extent1].[Id] AS [Id],
[Extent1].[EmailAddress] AS [EmailAddress],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[LastName] AS [LastName]
FROM [dbo].[Users] AS [Extent1]
WHERE ([Extent1].[Id] = 'b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */)
AND ('b5604f88-3e18-42a5-a45e-c66cc2a632d3' /* @p__linq__0 */ IS NOT NULL)) AS [Limit1]
Run Code Online (Sandbox Code Playgroud)
这里是第二个(更快)查询的sql.
SELECT [Extent1].[Id] AS [Id],
[Extent1].[EmailAddress] AS [EmailAddress],
[Extent1].[FirstName] …Run Code Online (Sandbox Code Playgroud) sql sql-server performance entity-framework database-performance
请考虑下表:
foo | bar
-----+-----
3 | 1
8 | 1
2 | 1
8 | 5
6 | 5
5 | 5
4 | 5
5 | 7
4 | 7
Run Code Online (Sandbox Code Playgroud)
列foo包含任何内容.列几乎bar是有序的,并且共同值的行彼此跟随.表包含约170万行,每个不同值约15行.barbar
我觉得PARTITION BY很慢,我想知道我是否可以采取任何措施来改善其性能?
我试过CREATE INDEX bar_idx ON foobar(bar)但它对性能没有影响(IRL已经在表的另一列上有一个主键).我正在使用PostgreSQL 9.3.5.
以下是EXPLAIN ANALYZE有和没有的简单查询PARTITION BY :
> EXPLAIN ANALYZE SELECT count(foo) OVER (PARTITION BY bar) FROM foobar;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
WindowAgg (cost=262947.92..293133.35 rows=1724882 width=8) (actual time=2286.082..3504.372 …Run Code Online (Sandbox Code Playgroud) postgresql query-optimization database-performance window-functions
我很好奇.我有这样的流程:我们有大量的数据集合/表.并且有一些select长期需要3秒的定向查询.
然而,我们期待高度并发的环境,每秒我们在数据库中获得100条新记录.
所以假设我们有一个查询,在查询开始之前,我们有1000个项目满足这些查询.查询需要3秒,每秒有50个新项目与添加到数据库的查询匹配.我的问题是 - 这是这个查询返回给我的结果(它仍然是1000或1150或介于两者之间)以及它如何依赖于不同的数据库引擎(SQL,NoSQL).Ø
这不是关于确切数字的问题,而是更多 - 为什么它将是那些数字.
看起来问题有点宽泛.让我们用MySQL,Postgres,MongoDB和Cassandra限制数据库.
我有一个包含超过 1000 万行的表。我在该表上创建了一个新列,然后尝试对其进行索引:
create index myTable_idx_myColumn on myTable(myColumn);
Run Code Online (Sandbox Code Playgroud)
该查询在大约一个小时后超时。然后我用该NOLOGGING选项重试了它,大约一个小时后成功完成。
问题解决了,对吧?不幸的是不是,因为这仅适用于开发数据库。prod 数据库有超过 2500 万行,因此理想情况下,我希望在创建索引之前找到更快的解决方案,以避免不必要的停机。
对我来说奇怪的是,根据我的理解,Oracle 默认情况下不包含null索引值(这正是我想要的)。对我来说,这意味着它应该只创建一个空白索引,因为新列中的所有值都是null创建索引时的。我知道它需要检查所有 1000 万行以确保它们是null,但即使这样似乎也不需要花费近一个小时......
有没有一种快速方法可以将索引添加到null大型表上的新列(即所有值都在其中)?
在某些条件下,我遇到了一个与慢速查询有关的奇怪问题:我进行了一些测试,并且能够将问题隔离到一个名为的单个表products_description(所有表都是 MyISAM)。起初我注意到当这个表是新的(即刚刚导入)时,查询总是执行得很快(~0.3s)。但是,如果我在此特定表上执行任何这些操作,则在任何时间(甚至在导入后立即执行):
CHECK, OPTIMIZE,ANALYZE或REPAIR,查询都会突然减慢 x10 倍(大约需要 4.5 秒)并且始终保持缓慢。
请注意,我在运行查询时强制无缓存以确保结果正确。
只有当我在该表上执行以下任何操作时,我才能恢复性能:
1)DROP表并再次导入。
或者
2)ALTER该表中的以下任何一项:Collation或CHECKSUM或DELAY_KEY_WRITE。然后它以更改的值快速运行,当恢复到旧值时,性能保持快速。或者ALTER products_description FORCE可以执行以恢复性能。
即便如此,如果我对该表执行任何CHECK, OPTIMIZE,ANALYZE或REPAIR操作,查询速度会下降,直到我执行 1) 或 2)
我测试的另一件事:在对表执行任何操作之前,我备份了表的文件 ( products_description.frm, products_description.MYD, products_description.MYI),运行查询,它运行得很快。然后我CHECK在表上执行,运行查询,速度慢了 10 倍,我复制了备份文件并覆盖了 3 个文件,再次运行查询,再次降低速度。
我已经将数据库压缩到了一个 ~5mb 的 zip 文件中(解压缩了 ~80mb)。如果有人想在您自己的环境中测试数据库,请告诉我,我会向您发送下载链接。我可以在几个不同的服务器上重现这个,在 MariaDB 10.1+ 和 MySQL 5.6+ 上。
这是我正在运行的 SQL 查询,您应该使用以下命令进行测试:
SELECT DISTINCT pav.products_options_values_id,
pav.products_options_values_name, …Run Code Online (Sandbox Code Playgroud) 我的问题直接来自这个问题,虽然我只对UPDATE感兴趣并且只对此感兴趣.
我有编写的应用程序中C/C++,这使得大量使用的SQLite,主要是SELECT/UPDATE,在一个非常频繁间隔(约20个查询每0.5至1秒)
我的数据库不大,此刻约有2500条记录,这里是表结构:
CREATE TABLE player (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(64) UNIQUE,
stats VARBINARY,
rules VARBINARY
);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我没有使用,transactions因为我正在改进代码并希望稳定而不是性能.
然后我通过仅执行10 update查询来测量我的数据库性能,以下(在不同值的循环中):
// 10 times execution of this
UPDATE player SET stats = ? WHERE (name = ?)
Run Code Online (Sandbox Code Playgroud)
其中stats一个JSON恰好是150个字符,name是5-10个字符.
没有交易,结果是不可接受的: - 大约1整秒(每个0.096)
随着交易,时间下降x7.5倍: - 约0.11 - 0.16秒(每个0.013)
我尝试删除数据库的大部分和/或重新排序/删除列,以查看是否有任何改变,但事实并非如此.即使数据库只包含100条记录(已测试),我也会得到上述数字.
然后我试着玩PRAGMA选项:
PRAGMA synchronous = …Run Code Online (Sandbox Code Playgroud) 我正在使用Oracle Database 11.2。我遇到的情况是我FLASHBACK DATABASE经常发布。似乎一个FLASHBACK DATABASE周期会重新启动数据库实例,这大约需要花费大约30%的时间。我的设置需要7秒。
数据库很小(〜1 GB表空间),所有文件应位于I / O缓存/缓冲区中。因此,我认为瓶颈不是基于I / O的。
我正在寻找调整建议,以节省执行闪回的用户时间和/或CPU时间。
更新:
闪回序列(以及每个步骤的时序)如下:
1. Get SYSDBA connection with prelim_auth=true [15 ms]
2. SHUTDOWN ABORT; [1034 ms]
3. STARTUP (unrestricted) [1241 ms]
4. Close SYSDBA connection [2 ms]
5. Get SYSDBA connection with prelim_auth=false [18 ms]
6. ALTER DATABASE MOUNT [4073 ms]
7. FLASHBACK DATABASE TO RESTORE POINT <restore_point_name> [306 ms]
8. ALTER DATABASE OPEN RESETLOGS [1652 ms]
9. CLOSE SYSDBA connection [2 ms]
Run Code Online (Sandbox Code Playgroud) mysql ×4
database ×3
performance ×3
sql ×3
oracle ×2
c++ ×1
concurrency ×1
flashback ×1
indexing ×1
logging ×1
mariadb ×1
node-mysql ×1
node.js ×1
nosql ×1
oracle10g ×1
postgresql ×1
sql-server ×1
sqlite ×1