我有多个用于业务数据的大表,最小的一个有 3800 万行(24G 数据,26G 索引大小)。我设置了索引来加快查找速度,并将缓冲池设置为总 RAM(116G) 的 80%。即使在这些设置之后,随着时间的推移,我们也开始观察到性能问题。我对磁盘大小(1T)有限制,并且目前无法选择分片。数据增长已增至每天 50 万行。这导致频繁的优化和主开关练习。表模式和索引已经被优化。因此,我开始考虑对表进行分区以提高性能。我的主要分区用例是通过删除分区每月删除数据,这样就不需要优化并改善读/写延迟。以下是其中一个大表的结构(由于法律原因列名已更改 - 假设定义索引的列具有查找用例):
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data_1` int(11) NOT NULL,
`data_2` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`data_3` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`data_4` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_data1` (`data_1`),
KEY `index_data2` (`data_2`)
) ENGINE=InnoDB AUTO_INCREMENT=100572 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
我计划在created_at列上进行分区。然而,问题是分区列必须是所有唯一键的一部分。我可以将created_at列添加到主键,但这会导致索引大小增加,这反过来又会产生副作用。有没有一些解决方法或更好的解决方案?
除了解决这个问题之外,还有一些问题在现有的任何文档或文章中都找不到答案。1.为什么mysql保证分区列是唯一键的一部分?2. 来自 ORM 的查询不存在 create_at 子句,这意味着我们无法对读取进行修剪,但只要插入始终被修剪,我们就可以接受。然而,看起来情况并非如此。为什么mysql要打开所有分区进行插入?
Mysql 版本 - 5.6.33-79.0-log Percona Server (GPL),版本 …
我有点不知道为什么我的MVC应用程序中的一个ASP视图运行得如此之慢.
我在控制器中使用linq选择一些数据.这很快就会运行:
public ActionResult Progress(int ID)
{
var reviewitems = from ri in db.ReviewItems
where ri.Enrolment.Course.LearningArea.LearningAreaID == ID && ri.Review.ReviewSeries.StartDate < DateTime.Now && ri.Review.ReviewSeries.EndDate > DateTime.Now && ri.Progress < 2
select ri;
return View("Progress", reviewitems);
}
Run Code Online (Sandbox Code Playgroud)
然后我在ASP视图中执行foreach循环,遍历已经传递给视图的'reviewitem'类型的数据的每一行.这很快:
<%foreach (var ri in Model)
{ %>
<tr>
<td><%= ri.Progress %></td>
</tr>
<%} %>
Run Code Online (Sandbox Code Playgroud)
我需要显示更多信息,因此我需要加入"评论"表(再次提供快速结果),然后加入"学生"表.这就是问题所在,开始耗时超过30秒:
<%foreach (var ri in Model)
{ %>
<tr>
<td><%= ri.Review.Student.Surname %></td>
</tr>
<%} %>
Run Code Online (Sandbox Code Playgroud)
每个评论项目链接到一个独特的学生,所以我不明白为什么这么长时间.有没有人有任何想法,我应该开始寻找为什么它这么慢?据推测它与'Student'表(实际上是一个SQL Server视图)有关,但我可以使用SQL在一秒钟内从中选择所有行?
我有一个场景,我需要检查10,000个不同的特定名称与一个约60,000个名称记录的表.假设缓存不相关,一般来说,出于性能目的,是否更好:
(1)分解为迷你查询,以便每个查询可能有200个不同的名称?
要么
(2)用10,000个"OR"子句写一个含糊的sql语句?
我刚刚在网上进行了快速搜索,但找不到确切的所需信息。
INNER JOIN与常规WHERE语句相比有多少效率?
我在PostgreSQL中有几个查询,它们需要使用一些通过键/外键条件“链接”在一起的表(比如说四个或五个)。为了实现这些查询,我使用WHERE子句来连接所有必需的表。
我想知道如果我使用INNER JOIN子句(而不是WHERE子句)重写这些查询,是否会获得性能提升?
我想在我的网站上添加一个新的讨论区域,用户可以在其中添加主题和接收评论.
我想我会为主题和评论添加一个新的数据库,以避免我的主数据库变得非常大.
但是,我需要连接到主数据库以检索用户信息,执行登录过程等.
那么,我的网站的表现应该更好呢?为什么?
1-在主数据库中添加新表以获取主题和注释.
2-仅为主题添加新数据库并建立2个DB连接.
注意:请注意不仅仅是这个具体案例的问题的一般概念.
php mysql performance performance-testing database-performance
\timing在PostgreSQL中打开,我可以看到命令运行所需的时间.
我运行相同的查询,在两台机器上使用相同的数据库和索引,并看到非常不同的结果.
在第一台机器上:
machine1=# EXPLAIN ANALYZE INSERT INTO "notes" ("content", "date", "inserted_at", "updated_at", "user_id") VALUES ('Something of note', '2015-4-27', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1) RETURNING id;
QUERY PLAN
---------------------------------------------------------------------------------------------
Insert on notes (cost=0.00..0.03 rows=1 width=0) (actual time=0.055..0.055 rows=1 loops=1)
-> Result (cost=0.00..0.03 rows=1 width=0) (actual time=0.016..0.016 rows=1 loops=1)
Planning time: 0.048 ms
Trigger for constraint notes_user_id_fkey: time=0.177 calls=1
Execution time: 0.286 ms
(5 rows)
Time: 2.218 ms
Run Code Online (Sandbox Code Playgroud)
在第二台机器上:
machine2=> EXPLAIN ANALYZE INSERT INTO "notes" ("content", "date", "inserted_at", "updated_at", "user_id") VALUES ('Something …Run Code Online (Sandbox Code Playgroud) 我们知道在表上有索引会降低插入/更新/删除(CUD)性能.我想知道我是否使用字段作为包含列,影响(CUD)性能有多大.
我的意思是,比较以下索引之间的性能下降:
CREATE UNIQUE NONCLUSTERED INDEX [Idx1] ON dbo.Table (Col1, Col2)
Run Code Online (Sandbox Code Playgroud)
和
CREATE UNIQUE NONCLUSTERED INDEX [Idx1] ON dbo.Table (Col1, Col2) INCLUDE (Col3)
Run Code Online (Sandbox Code Playgroud)
笔记:
我想运行sql profiler来查看数据库Sql Server 2008的性能,但恐怕在同一台计算机上运行Profiler会影响服务器的性能,并且我不想降低服务器的速度。
很久以前,我从一个DBA那里听说,他不从他连接到sql服务器的笔记本电脑上运行探查器,但这种方式不会影响服务器的性能。
令人费解的是,我的问题是如何从外部计算机运行Sql事件探查器而不导致sql server的性能下降?
sql-server sql-server-profiler sql-server-2008 database-performance database-tuning
我正在尝试从工作站监视VisualGC。
命令: java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个策略文件,并尝试启动jstatd,如下所示。
文件名: jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
尝试执行的命令: jstatd -J-Djava.security.policy = jstatd.all.policy
错误: -bash:jstatd:找不到命令
命令: rpm -qa | grep java
输出:
tzdata-java-2017c-1.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.151-5.b12.el7_4.x86_64
java-1.8.0-openjdk-1.8.0.151-5.b12.el7_4.x86_64
python-javapackages-3.4.1-11.el7.noarch
Run Code Online (Sandbox Code Playgroud)
另外,在visualvm的“选项卡:Visual GC”上,我看到“此JVM不支持”
我已经设置了一个PostgreSQL测试环境,它需要包含与生产数据库相同数量的数据(行数),并且主要配置为类似生产,以模拟正常事务的相同性能.
但是,它是一个测试环境,偶尔必须应用一些独特的,实验性的,临时的或临时的更改.例如,在性能测试之前添加或删除一些索引,重新计算列的值以复制测试条件,转储和重新导入整个表等.
有没有办法临时暂停数据完整性保证,以便尽快执行此类类型的批量更新?
例如,在MySQL中,您可以设置超大的写缓冲区,禁用事务日志记录,并在事务提交时挂起磁盘刷新.pgsql中有类似的东西吗?
部署环境是AWS EC2.
mysql ×3
postgresql ×3
database ×2
sql ×2
sql-server ×2
asp.net-mvc ×1
bulkupdate ×1
c# ×1
indexing ×1
java ×1
join ×1
jvm ×1
jvm-hotspot ×1
linq-to-sql ×1
partitioning ×1
performance ×1
php ×1
where ×1