标签: query-optimization

如何正确索引多个关联表?

在像这样的典型的许多安排......

Movies       Actors       Movies_Actors
------       ------       -------------
movie_ID     actor_ID     FK_movie_ID
title        name         FK_actor_ID

...如何将关联表('Movies_Actors')索引以获得最佳读取速度?

我通常只在关联表中使用复合主键来完成此操作,如下所示:

CREATE TABLE Movies_Actors (
  FK_movie_ID INTEGER,
  FK_actor_ID INTEGER,
  PRIMARY KEY (FK_movie_ID, FK_actor_ID)
)
Run Code Online (Sandbox Code Playgroud)

然而,这似乎是指数搜索时才有用处 movie_IDactor_ID(虽然我不是一个综合指数是否也适用于各个列确定).

由于两个"什么演员在电影X"和"有演员Ÿ一直处于什么样的电影"将是此表的通用查询,似乎应该对每一列单独的索引快速找到自己的角色和电影.复合索引是否有效地做到了这一点?如果没有,那么在这张桌子上使用复合索引似乎毫无意义.如果复合索引毫无意义,那么如何处理主键呢?候选键显然是两列的组合,但是如果得到的复合索引是无意义的(它一定不是?),这似乎是浪费.

此外,这个环节增加了一些困惑,并表示,它甚至可能是真正有用的指定2个综合指数...他们为一体(FK_movie_ID, FK_actor_ID),另一个反向的(FK_actor_ID, FK_movie_ID),与选择哪种是主键(因而通常聚集并且'只是'一个独特的复合索引,基于更多的查询方向.

什么是真实的故事?复合索引是否自动有效地索引每列以便在一个或另一个上进行搜索?应的最佳(在读出速度,而不是尺寸)关联表具有在每个方向上的复合指数每列一个?什么是幕后机制?


编辑:我发现这个相关的问题,由于某种原因,我没有在发布之前找到... 如何正确索引MySQL中的多对多连接的链接表?

sql sql-server postgresql many-to-many query-optimization

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

需要帮助来优化MySQL查询

我有6张桌子:

CREATE TABLE IF NOT EXISTS `sbpr_groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `active` tinyint(1) DEFAULT '0',
  `dnd` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ;

CREATE TABLE IF NOT EXISTS `sbpr_newsletter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `from` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `mail` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `subject` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `body` text COLLATE utf8_unicode_ci,
  `attach1` varchar(255) COLLATE utf8_unicode_ci NOT NULL, …
Run Code Online (Sandbox Code Playgroud)

mysql sql optimization query-optimization

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

您如何确保新索引不会减慢查询速度?

当我们添加或删除新索引以加速某些事情时,我们最终可能会放慢速度.为了防止这种情况,在创建新索引后,我正在执行以下步骤:

  1. 启动Profiler,
  2. 运行一个包含大量查询的SQL脚本,我不想放慢速度
  3. 将跟踪从文件加载到表中,
  4. 在添加(或删除)索引之前,分析来自跟踪的CPU,读取和写入以及先前运行的结果.

这是一种自动化的,可以满足我的需求.但是,我不确定是否有更好的方法.是否有一些工具可以满足我的需求?

编辑1投票结束我的问题的人,你能解释一下你的理由吗?

编辑2我搜索了,但没有找到任何解释如何添加索引可以减慢选择.然而,这是一个众所周知的事实,所以应该有某种东西.如果什么都没有出现,我可以稍后写几个例子.

编辑3一个这样的例子是:两列高度相关,如身高和体重.我们有一个高度索引,对我们的查询来说没有足够的选择性.我们在权重上添加一个索引,并运行一个包含两个条件的查询:高度范围和权重范围.因为优化器不知道相关性,所以它严重低估了查询的基数.

另一个例子是在增加列上添加索引(例如OrderDate)会严重减慢查询的速度,如OrderDate> SomeDateAfterCreatingTheIndex.

sql-server query-optimization sql-server-2008 sql-server-2008-r2

19
推荐指数
2
解决办法
6107
查看次数

MySQL EXPLAIN UPDATE

作为我大学修订的一部分,我想回答以下问题:

在"employees"数据库中的表的至少一个属性上创建索引,在该数据库中使用MySQL"EXPLAIN"工具清楚地显示创建的好处(以术语或retreival)和否定(在更新方面)有问题的指数.

对于第一部分,我在employees表上创建了一个索引,并在索引之前和之后使用以下查询从检索角度证明它是有益的:

EXPLAIN SELECT * FROM employees WHERE birth_date = '1953-09-02';
Run Code Online (Sandbox Code Playgroud)

该索引具有将访问的行从300,000减少到63的效果.

现在,我很难过如何做第二部分.我希望能够使用带有UPDATEEXPLAIN命令,但它不适用于此.

我正在尝试分析的UPDATE查询如下:

UPDATE employee SET first_name = 'first_name' WHERE birth_date = '1953-09-02';
Run Code Online (Sandbox Code Playgroud)

这是一个合适的查询来回答问题,我该如何分析.

提前谢谢了.

mysql sql database query-optimization

19
推荐指数
2
解决办法
2万
查看次数

SQLite中的外键优化

我知道SQLite本身并不强制执行外键,但这不是我主要关注的问题.问题是:如果我宣布

CREATE TABLE invoice (
  invoiceID INTEGER PRIMARY KEY,
  clientID INTEGER REFERENCES client(clientID),
  ...
  )
Run Code Online (Sandbox Code Playgroud)

sqlite至少会使用clientID是外键的信息来优化查询并自动索引invoice.clientID,还是这个约束是真正的无操作?

sqlite indexing foreign-keys query-optimization

18
推荐指数
2
解决办法
7046
查看次数

在innoDB中优化MySQL LIKE'%string%'查询

有这个表:

CREATE TABLE `example` (
`id` int(11) unsigned NOT NULL auto_increment,
`keywords` varchar(200) NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我们想优化以下查询:

SELECT id FROM example WHERE keywords LIKE '%whatever%'
Run Code Online (Sandbox Code Playgroud)

该表是InnoDB,(现在没有FULLTEXT),这将是用于优化此类查询的最佳索引?

我们尝试过一个简单的方法:

ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`);
Run Code Online (Sandbox Code Playgroud)

但是一个解释查询显示需要扫描整个表, 如果我们的查询LIKE'无论%'代替,这个索引表现良好,但在其他方面没有价值.

无论如何要为innoDB优化这个吗?

谢谢!

mysql sql indexing query-optimization

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

使用索引扫描,PostgreSQL查询运行得更快,但引擎选择散列连接

查询:

SELECT "replays_game".*
FROM "replays_game"
INNER JOIN
 "replays_playeringame" ON "replays_game"."id" = "replays_playeringame"."game_id"
WHERE "replays_playeringame"."player_id" = 50027
Run Code Online (Sandbox Code Playgroud)

如果我设置SET enable_seqscan = off,那么它做的很快,这是:

QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Nested Loop  (cost=0.00..27349.80 rows=3395 width=72) (actual time=28.726..65.056 rows=3398 loops=1)
   ->  Index Scan using replays_playeringame_player_id on replays_playeringame  (cost=0.00..8934.43 rows=3395 width=4) (actual time=0.019..2.412 rows=3398 loops=1)
         Index Cond: (player_id = 50027)
   ->  Index Scan using replays_game_pkey on replays_game  (cost=0.00..5.41 rows=1 width=72) (actual time=0.017..0.017 rows=1 loops=3398)
         Index Cond: (id = replays_playeringame.game_id)
 Total runtime: 65.437 ms
Run Code Online (Sandbox Code Playgroud)

但是如果没有可怕的enable_seqscan,它会选择做一个更慢的事情:

QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

postgresql indexing query-optimization postgresql-performance

18
推荐指数
2
解决办法
9105
查看次数

如何使用许多JOIN提高查询性能

我有一个查询(目的是创建一个视图),它使用一些连接来获取每一列.对于添加的每组连接,性能会快速降低(指数级?).

什么是使这个查询更快的好方法?请查看查询中的注释.

如果有帮助,这是使用WordPress数据库架构.

这是EXPLAIN的屏幕截图 在此输入图像描述

产品表

+--+----+
|id|name|
+--+----+
|1 |test|
+--+----+
Run Code Online (Sandbox Code Playgroud)

元数据表

+----------+--------+-----+
|product_id|meta_key|value|
+----------+--------+-----+
|1         |price   |9.99 |
+----------+--------+-----+
|1         |sku     |ABC  |
+----------+--------+-----+
Run Code Online (Sandbox Code Playgroud)

TERM_RELATIONSHIPS表

+---------+----------------+
|object_id|term_taxonomy_id|
+---------+----------------+
|1        |1               |
+---------+----------------+
|1        |2               |
+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

TERM_TAXONOMY表

+----------------+-------+--------+
|term_taxonomy_id|term_id|taxonomy|
+----------------+-------+--------+
|1               |1      |size    |
+----------------+-------+--------+
|2               |2      |stock   |
+----------------+-------+--------+
Run Code Online (Sandbox Code Playgroud)

条款表

+-------+-----+
|term_id|name |
+-------+-----+
|1      |500mg|
+-------+-----+
|2      |10   |
+-------+-----+
Run Code Online (Sandbox Code Playgroud)

QUERY

SELECT 
  products.id,
  products.name,
  price.value AS price,
  sku.value AS sku,
  size.name AS size
FROM products

/* These …
Run Code Online (Sandbox Code Playgroud)

mysql sql performance select query-optimization

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

或SQL运算符短路

我想咨询SQL Server OR短路

码:

   DECLARE @tempTable table
      (
         id int
      )
      INSERT @tempTable(id) values(1)

      DECLARE @id varchar(10)
      SET @id = 'x'
      SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
      SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int
Run Code Online (Sandbox Code Playgroud)

为什么?1 = 1且@ id ='x'为真.

SQL Server OR运算符:是否有短路功能?

谢谢

t-sql sql-server query-optimization short-circuiting

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

如何使JOIN查询使用索引?

我有两张桌子:

CREATE TABLE `articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(1000) DEFAULT NULL,
  `last_updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `last_updated` (`last_updated`),
) ENGINE=InnoDB AUTO_INCREMENT=799681 DEFAULT CHARSET=utf8 

CREATE TABLE `article_categories` (
  `article_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`article_id`,`category_id`),
  KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

SELECT a.*
FROM
    articles AS a,
    article_categories AS c
WHERE
    a.id = c.article_id
    AND c.category_id = 78
    AND a.comment_cnt > 0
    AND a.deleted …
Run Code Online (Sandbox Code Playgroud)

mysql sql join query-optimization

17
推荐指数
2
解决办法
4万
查看次数