在MySQL中,如何构建索引来加速这个查询?
SELECT c1, c2 FROM t WHERE c3='foobar';
Run Code Online (Sandbox Code Playgroud) 我有一个MySQL 5.6.27-0ubuntu0.14.04.1,运行在带有4个CPU的Google Compute实例上.
我注意到如果我连接睡眠很长时间,那么服务器的CPU将以线性方式增加.我不明白为什么?如果我终止Sleep连接,那么CPU只是恢复到正确的用法.
然后我检查服务器上的进程列表
mysql> show processlist
-> ;
+-------+--------+-------------------+----------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+--------+-------------------+----------------+---------+------+-------+------------------+
| 85949 | nafora | paper-eee-2:58461 | state_recorder | Sleep | 1300 | | NULL |
| 85956 | nafora | paper-eee-2:58568 | state_recorder | Sleep | 64 | | NULL |
| 85959 | root | localhost | NULL | Query | 0 | init | show processlist | …Run Code Online (Sandbox Code Playgroud) 我们一直在经历SQL超时,并确定该瓶颈是审计表 - 我们系统中的所有表都包含插入,更新和删除触发器,这会导致新的审计记录.
这意味着审计表是系统中最大且最繁忙的表.然而,数据只会进入,并且永远不会出现(在此系统下),因此不需要select执行任何性能.
select top 10最近运行一个返回记录而不是"第一个"记录. order by当然可以工作,但是我希望选择顶部应该根据它们在光盘上的顺序返回行 - 我希望它会返回最低的PK值.
有人建议我们删除聚集索引,实际上也是主键(唯一约束).正如我之前提到的,select在这个系统中没有必要从这个表中获取.
聚集索引在表上创建什么样的性能?拥有无索引,非聚集,无密钥表的(非选择)分支是什么?还有其他建议吗?
编辑
我们的审计涉及CLR功能,我现在使用和不使用PK,索引,FK等进行基准测试,以确定CLR功能和约束的相对成本.
经过调查,表现不佳与insert陈述无关,而是与编制审计的CLR功能无关.删除CLR后使用直接TSQL proc,性能提高了20倍.
在测试期间,我还确定聚簇索引和标识列对插入时间的影响很小或没有差别,至少相对于发生的任何其他处理而言.
// updating 10k rows in a table with trigger
// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms
// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms
Run Code Online (Sandbox Code Playgroud) primary-key clustered-index sql-server-2008 database-performance
假设一张表CAR有两列CAR_ID (int)和VERSION (int).
我想检索每辆车的最大版本。
所以有两种解决方案(至少):
select car_id, max(version) as max_version
from car
group by car_id;
Run Code Online (Sandbox Code Playgroud)
或者 :
select car_id, max_version
from ( select car_id, version
, max(version) over (partition by car_id) as max_version
from car
) max_ver
where max_ver.version = max_ver.max_version
Run Code Online (Sandbox Code Playgroud)
这两个查询的性能相似吗?
在我的慢查询日志中,我看到的是慢查询
# Time: 121107 16:34:02 # User@Host: web_node[web_node] @ localhost [127.0.0.1] # Thread_id: 34436186 Schema: test_db Last_errno: 0 Killed: 0 # Query_time: 1.413751 Lock_time: 0.000222 Rows_sent: 203 Rows_examined: 203 Rows_affected: 0 Rows_read: 203 # Bytes_sent: 7553 Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_table_sizes: 0 # InnoDB_trx_id: 9B04384 SET timestamp=1352334842; SELECT id, email FROM test_data WHERE id IN (13089576,3002681,3117763,1622233,2941590,12305279,1732672,2446772,3189510,13084725,4943929,5855071,6572137,2266261,3003496,2024860,3336832,13758671,6477694,1796684,13001771,4690025,1071744,1017876,5175795,795988,1619821,2481819,2941090,4770802,13438250,3254708,2323402,526303,13219855,3313573,3190479,1733761,3300577,2941758,6474118,1733379,11523598,4205064,6521805,2492903,1860388,3337093,5205317,1213970,5442738,12194039,1214203,12970536,3076611,3126152,3677156,5305021,2751587,4954875,875480,2105172,5309382,12981920,5204330,13729768,3254503,5030441,2680750,590661,1338572,7272410,1860386,2567550,5434143,1918035,5329411,1683235,3254119,5175784,1855380,3336834,2102567,4749746,37269,3207031,6464336,2227907,2713471,3937600,2940442,2233821,5619141,5204711,5988803,5050821,10109926,5226877,5050275,1874115,13677832,5338699,2423773,6432937,6443660,1990611,6090667,6527411,6568731,3254846,3414049,2011907,5180984,12178711,8558260,3130655,5864745,2059318,3480233,2104948,2387703,1939395,5356002,2681209,1184622,1184456,10390165,510854,7983305,795991,2622393,4490187,9436477,5356051,2423464,5205318,1600499,13623229,3255205,12200483,6477706,3445661,5226284,1176639,13760962,2101681,6022818,12909371,1732457,2377496,7260091,12191702,2492899,2630691,13047691,1684470,9382108,2233737,13117701,1796698,2535914,4941741,4565958,1100410,2321180,13080467,813342,4563877,4689365,2104756,1102802,2714488,3188947,1599770,1558291,5592740,5233428,5204830,1574452,3188956,13693326,2102349,3704111,1748303,790889,9323280,4741494,2387900,5338213,3583795,2283942,3189482,3002296,4490123,3585020,962926,3481423,1600920,1682364,4693123,6487778,2677582,2377195);
当我使用SQL_NO_CACHE通过探查器运行慢速查询时,它看起来如此
203 rows in set (0.03 sec) show profile for query 33; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | 0.000187 | …
mysql innodb query-optimization database-performance mysql-slow-query-log
从SQLite数据库加载10,000行到内存的最快方法是什么?每行有1个文本和4个整数.目前,我这样做:
while(!cursor.isAfterLast()) {
cursor.copyStringToBuffer(column_index_1, buffer);
cursor.copyStringToBuffer(column_index_2, buffer);
cursor.copyStringToBuffer(column_index_3, buffer);
cursor.copyStringToBuffer(column_index_4, buffer);
cursor.copyStringToBuffer(column_index_5, buffer);
cursor.moveToNext();
}
Run Code Online (Sandbox Code Playgroud)
Galaxy Nexus上面的代码大约需要750毫秒.在较旧的设备上,它可能会慢几倍.我可以加快速度吗?
(此时,你可能会输入类似"为什么需要将行加载到内存中?"这有点复杂但我可以尝试解释一下是否有人感兴趣.编辑:这是解释:https:// gist .github.com/fhucho/af355d56ae3145e3e30f)
我有一个非常简单的测试程序,它使用ACKNOWLEDGED批量插入比使用UNACKNOWLEDGED. 而且它不仅仅是快了一点 - 我看到了将近 100 倍!
我对这两种写关注之间的区别的理解仅仅是ACKNOWLEDGED客户端等待服务器确认操作已执行(但不一定持久),而UNACKNOWLEDGED客户端只知道请求已发送到金属丝。因此,前者实际上可以以更高的速度执行似乎很荒谬,但这就是我所看到的。
我在 64 位 Windows 7 上使用 Java 驱动程序 (v2.12.0) 和 Oracle 的 Java JDK v1.7.0_71 和 mongo 版本 3.0.0。我正在运行 mongod,完全开箱即用(新鲜安装),没有分片或任何东西。在每次测试之前,我确保集合为空并且没有非默认索引。
如果您能深入了解为什么我总是看到与我期望的相反的东西,我将不胜感激。
谢谢。
这是我的代码:
package test;
import com.mongodb.BasicDBObject;
import com.mongodb.BulkWriteOperation;
import com.mongodb.BulkWriteResult;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcern;
import java.util.Arrays;
public class Test {
private static final int BATCHES = 100;
private static final int BATCH_SIZE = 1000;
private static final int …Run Code Online (Sandbox Code Playgroud) sys.dm_db_missing_index_group_stats的文档使用术语"用户查询"和"系统查询",但它没有定义这些含义.例如:
基于在System查询中使用该术语的方式来确定数据库中权限的完整(包括从AD ROLES继承)的视图?,我假设系统查询是针对系统表的查询.然后,用户查询必须是针对用户表的查询.
有没有人对这两个术语的定义有更权威的来源?我问,因为我正在使用sys.dm_db_missing_index_group_stats的结果,并考虑如何在决定是否应用索引时正确权衡avg_user_impact与avg_system_impact.
sql-server sqlperformance database-performance sql-server-2012
我来自Web开发的前端世界,我们非常努力地限制发出的HTTP请求数量(通过合并css,js文件,图像等).
使用数据库连接(MySQL),显然你不希望有不必要的连接,但作为一般规则,有多个小查询有多糟糕?(他们执行得很快)
我问,因为我正在将我的应用程序移动到集群环境中以及在我在服务器内存中缓存一些内容之前(因为我在单个服务器上运行),我现在正试图使我的应用程序"无状态"并且在我当前实现意味着更小的db调用.这将帮助我实现负载平衡(避免粘性会话)并降低服务器内存使用率.
我们不是在谈论大量的查询,可能是6-8个db调用而不是2-4个调用,从少量记录返回到几千个记录.它们中的每一个都快速执行,不到30ms(一些更少),但我不知道是否存在一些我应该关注的"连接延迟".
感谢您的见解.
我们的应用程序目前使用 H2 作为嵌入式数据库,我们有以下场景:
H2 用作“临时数据库”。插入到 H2 中的数据每 30 分钟由应用程序任务定期发送/插入到 Oracle 数据库(“官方”数据库),并从 H2 中删除;
这个主要的“临时表”在一个表中平均每小时插入 183 行。
我们还有另外两个大表(分别有 2100 万和 150 万条记录),主要用于查询。还有另一个应用程序任务从 Oracle 增量更新这些表,更新自上次同步以来在 Oracle 中创建/更新/删除的 H2 行。它也每 30 分钟发生一次。
到目前为止,我们已经使用 H2 1.5 年了,没有出现任何问题,但我们在Red Hat 官方文档中发现了以下关于 H2 的警告:
但是,它不应在生产环境中使用。它是一个非常小的、自包含的数据源,支持测试和构建应用程序所需的所有标准,但对于生产使用来说不够健壮或可扩展。
在这样的场景中,H2 是否设计并可靠地用于生产环境?
是否有任何基准支持这一点?该H2正式性能基准测试显示执行时间和性能的使用,但不要说有关数据量什么。
mysql ×4
android ×1
bulkinsert ×1
coldfusion ×1
cpu-usage ×1
database ×1
h2 ×1
indexing ×1
innodb ×1
java ×1
lucee ×1
mongodb ×1
oracle ×1
primary-key ×1
sql ×1
sql-server ×1
sqlite ×1