在像这样的典型的许多安排......
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_ID和actor_ID(虽然我不是一个综合指数是否也适用于各个列确定).
由于两个"什么演员在电影X"和"有演员Ÿ一直处于什么样的电影"将是此表的通用查询,似乎应该对每一列单独的索引快速找到自己的角色和电影.复合索引是否有效地做到了这一点?如果没有,那么在这张桌子上使用复合索引似乎毫无意义.如果复合索引毫无意义,那么如何处理主键呢?候选键显然是两列的组合,但是如果得到的复合索引是无意义的(它一定不是?),这似乎是浪费.
此外,这个环节增加了一些困惑,并表示,它甚至可能是真正有用的指定2个综合指数...他们为一体(FK_movie_ID, FK_actor_ID),另一个反向的(FK_actor_ID, FK_movie_ID),与选择哪种是主键(因而通常聚集并且'只是'一个独特的复合索引,基于更多的查询方向.
什么是真实的故事?复合索引是否自动有效地索引每列以便在一个或另一个上进行搜索?应的最佳(在读出速度,而不是尺寸)关联表具有在每个方向上的复合指数和每列一个?什么是幕后机制?
编辑:我发现这个相关的问题,由于某种原因,我没有在发布之前找到... 如何正确索引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) 当我们添加或删除新索引以加速某些事情时,我们最终可能会放慢速度.为了防止这种情况,在创建新索引后,我正在执行以下步骤:
这是一种自动化的,可以满足我的需求.但是,我不确定是否有更好的方法.是否有一些工具可以满足我的需求?
编辑1投票结束我的问题的人,你能解释一下你的理由吗?
编辑2我搜索了,但没有找到任何解释如何添加索引可以减慢选择.然而,这是一个众所周知的事实,所以应该有某种东西.如果什么都没有出现,我可以稍后写几个例子.
编辑3一个这样的例子是:两列高度相关,如身高和体重.我们有一个高度索引,对我们的查询来说没有足够的选择性.我们在权重上添加一个索引,并运行一个包含两个条件的查询:高度范围和权重范围.因为优化器不知道相关性,所以它严重低估了查询的基数.
另一个例子是在增加列上添加索引(例如OrderDate)会严重减慢查询的速度,如OrderDate> SomeDateAfterCreatingTheIndex.
sql-server query-optimization sql-server-2008 sql-server-2008-r2
作为我大学修订的一部分,我想回答以下问题:
在"employees"数据库中的表的至少一个属性上创建索引,在该数据库中使用MySQL"EXPLAIN"工具清楚地显示创建的好处(以术语或retreival)和否定(在更新方面)有问题的指数.
对于第一部分,我在employees表上创建了一个索引,并在索引之前和之后使用以下查询从检索角度证明它是有益的:
EXPLAIN SELECT * FROM employees WHERE birth_date = '1953-09-02';
Run Code Online (Sandbox Code Playgroud)
该索引具有将访问的行从300,000减少到63的效果.
现在,我很难过如何做第二部分.我希望能够使用带有UPDATE的EXPLAIN命令,但它不适用于此.
我正在尝试分析的UPDATE查询如下:
UPDATE employee SET first_name = 'first_name' WHERE birth_date = '1953-09-02';
Run Code Online (Sandbox Code Playgroud)
这是一个合适的查询来回答问题,我该如何分析.
提前谢谢了.
我知道SQLite本身并不强制执行外键,但这不是我主要关注的问题.问题是:如果我宣布
CREATE TABLE invoice (
invoiceID INTEGER PRIMARY KEY,
clientID INTEGER REFERENCES client(clientID),
...
)
Run Code Online (Sandbox Code Playgroud)
sqlite至少会使用clientID是外键的信息来优化查询并自动索引invoice.clientID,还是这个约束是真正的无操作?
有这个表:
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优化这个吗?
谢谢!
查询:
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
我有一个查询(目的是创建一个视图),它使用一些连接来获取每一列.对于添加的每组连接,性能会快速降低(指数级?).
什么是使这个查询更快的好方法?请查看查询中的注释.
如果有帮助,这是使用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) 我想咨询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运算符:是否有短路功能?
谢谢
我有两张桌子:
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) sql ×6
mysql ×5
indexing ×3
sql-server ×3
postgresql ×2
database ×1
foreign-keys ×1
join ×1
many-to-many ×1
optimization ×1
performance ×1
select ×1
sqlite ×1
t-sql ×1