标签: database-performance

Mysql分区对索引的影响

我有多个用于业务数据的大表,最小的一个有 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),版本 …

mysql database partitioning database-performance

2
推荐指数
1
解决办法
2042
查看次数

MVC应用程序中的表连接速度非常慢

我有点不知道为什么我的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在一秒钟内从中选择所有行?

c# sql asp.net-mvc linq-to-sql database-performance

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

一个巨大的SQL语句或许多小的SQL语句?

我有一个场景,我需要检查10,000个不同的特定名称与一个约60,000个名称记录的表.假设缓存不相关,一般来说,出于性能目的,是否更好:

(1)分解为迷你查询,以便每个查询可能有200个不同的名称?

要么

(2)用10,000个"OR"子句写一个含糊的sql语句?

mysql sql database database-performance

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

PostgreSQL-INNER JOIN vs WHERE,哪个会表现更好?

我刚刚在网上进行了快速搜索,但找不到确切的所需信息。

INNER JOIN与常规WHERE语句相比有多少效率?

我在PostgreSQL中有几个查询,它们需要使用一些通过键/外键条件“链接”在一起的表(比如说四个或五个)。为了实现这些查询,我使用WHERE子句来连接所有必需的表。

我想知道如果我使用INNER JOIN子句(而不是WHERE子句)重写这些查询,是否会获得性能提升?

postgresql join where database-performance

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

PHP中的多个MySQL数据库连接是好还是坏?

我想在我的网站上添加一个新的讨论区域,用户可以在其中添加主题和接收评论.

我想我会为主题和评论添加一个新的数据库,以避免我的主数据库变得非常大.

但是,我需要连接到主数据库以检索用户信息,执行登录过程等.

那么,我的网站的表现应该更好呢?为什么?

1-在主数据库中添加新表以获取主题和注释.

2-仅为主题添加新数据库并建立2个DB连接.

注意:注意不仅仅是这个具体案例的问题的一般概念.

php mysql performance performance-testing database-performance

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

额外时间没有反映在PostgreSQL EXPLAIN ANALYZE中?

\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)

postgresql database-performance

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

索引中包含列的性能影响

我们知道在表上有索引会降低插入/更新/删除(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)

笔记:

  1. Col3是一个小字段(如int/decimal/date)
  2. 该表有大约1亿行

sql-server indexing database-performance

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

如何从外部计算机将SQL Profiler运行到SQL SERVER?

我想运行sql profiler来查看数据库Sql Server 2008的性能,但恐怕在同一台计算机上运行Profiler会影响服务器的性能,并且我不想降低服务器的速度。

很久以前,我从一个DBA那里听说,他不从他连接到sql服务器的笔记本电脑上运行探查器,但这种方式不会影响服务器的性能。

令人费解的是,我的问题是如何从外部计算机运行Sql事件探查器而不导致sql server的性能下降?

sql-server sql-server-profiler sql-server-2008 database-performance database-tuning

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

jstatd,找不到命令CentOS 7

我正在尝试从工作站监视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不支持”

java jvm jvm-hotspot database-performance cassandra-2.1

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

可以配置PostgreSQL,以便偶尔进行大规模更新可以超快速运行吗?

我已经设置了一个PostgreSQL测试环境,它需要包含与生产数据库相同数量的数据(行数),并且主要配置为类似生产,以模拟正常事务的相同性能.

但是,它是一个测试环境,偶尔必须应用一些独特的,实验性的,临时的或临时的更改.例如,在性能测试之前添加或删除一些索引,重新计算列的值以复制测试条件,转储和重新导入整个表等.

有没有办法临时暂停数据完整性保证,以便尽快执行此类类型的批量更新?

例如,在MySQL中,您可以设置超大的写缓冲区,禁用事务日志记录,并在事务提交时挂起磁盘刷新.pgsql中有类似的东西吗?

部署环境是AWS EC2.

postgresql database-performance bulkupdate

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