- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有三张 table 。
CREATE TABLE movies (
id INT AUTO_INCREMENT,
name VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE movies_actors (
id INT AUTO_INCREMENT,
movie_id INT,
actor_id INT,
current_salary_id INT,
PRIMARY KEY (id),
KEY movie_id (movie_id),
KEY actor_id (actor_id),
KEY current_salary_id (current_salary_id)
);
CREATE TABLE movies_actors_salaries (
id INT AUTO_INCREMENT,
actor_id INT,
compensation_type ENUM('salary','hourly','commission','lumpsum'),
amount DECIMAL(9,2),
date_agreed_upon DATETIME,
PRIMARY KEY (id),
KEY actor_id (actor_id)
);
我正在尝试连接表来执行一些查询,但索引的使用非常零散,我不知道为什么。
SELECT COUNT(1)
FROM movies m
JOIN movies_actors ma ON m.id = ma.movie_id
JOIN movies_actors_salaries mas ON ma.current_salary_id = mas.id;
如果我对 ma 表的 Extra 列进行解释,则不会显示“使用索引”。我是否执行LEFT JOIN movie_actors_salaries
或JOIN movie_actors_salaries
并不重要 - 它只是没有被使用。我不明白,因为 m.id 是电影表的主键,而 ma.movie_id 是键。
我也尝试了另一个查询:
SELECT COUNT(1)
FROM movies m
JOIN movies_actors ma ON m.id = ma.movie_id
JOIN movies_actors_salaries mas ON ma.id = mas.actor_id;
如果我对 ma 表的 Extra 列没有说“使用索引”进行解释,但如果我执行 LEFT JOIN movie_actors_salaries
而不是 JOIN
索引确实被使用了。同样,我不明白 - 为什么 movie_actor 表使用的索引取决于我加入 movie_actors_salaries 表的方式?
老实说,我一点也不明白。在我看来,当 EXPLAIN 完成时,所有四个(即上面两个带有 JOIN movie_actors_salaries
和带有 LEFT JOIN movie_actors_salaries
)的 Extra 列应该显示“使用索引”。
我正在使用 Percona MySQL 5.5.35-33.0。有什么想法吗?
最佳答案
比 rows=1 和 Using where
for ma
更受关注:
mysql> explain SELECT COUNT(m.id) FROM movies m JOIN movies_actors ma ON m.id = ma.movie_id JOIN movies_actors_salaries mas ON ma.current_salary_id = mas.id;
+----+-------------+-------+--------+----------------------------+---------+---------+-----------------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+----------------------------+---------+---------+-----------------------------------+------+-------------+
| 1 | SIMPLE | ma | ALL | movie_id,current_salary_id | NULL | NULL | NULL | 1 | Using where |
| 1 | SIMPLE | mas | eq_ref | PRIMARY | PRIMARY | 4 | so_gibberish.ma.current_salary_id | 1 | Using index |
| 1 | SIMPLE | m | eq_ref | PRIMARY | PRIMARY | 4 | so_gibberish.ma.movie_id | 1 | Using index |
+----+-------------+-------+--------+----------------------------+---------+---------+-----------------------------------+------+-------------+
3 rows in set (0.05 sec)
是此处看到的最后一个键的掉落:
-- drop table movies_actors;
CREATE TABLE movies_actors (
id INT AUTO_INCREMENT,
movie_id INT,
actor_id INT,
current_salary_id INT,
PRIMARY KEY (id),
KEY movie_id (movie_id),
KEY actor_id (actor_id)
-- KEY current_salary_id (current_salary_id)
);
导致新的可怕 解释
,其中 rows=1024 和 Using where;在上述架构更改和堵塞行之后,使用连接缓冲区( block 嵌套循环)
或使用文件排序
或使用临时
:
+----+-------------+-------+--------+---------------+----------+---------+--------------------------+------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+----------+---------+--------------------------+------+----------------------------------------------------+
| 1 | SIMPLE | mas | index | PRIMARY | actor_id | 5 | NULL | 1 | Using index |
| 1 | SIMPLE | ma | ALL | movie_id | NULL | NULL | NULL | 1024 | Using where; Using join buffer (Block Nested Loop) |
| 1 | SIMPLE | m | eq_ref | PRIMARY | PRIMARY | 4 | so_gibberish.ma.movie_id | 1 | Using index |
+----+-------------+-------+--------+---------------+----------+---------+--------------------------+------+----------------------------------------------------+
Explain
很神秘,就好像您不知道一样,但与刚刚提到的替代方案(即:1k 行和文件排序、临时表)相比,您的行数较低的事实应该是令人欣慰的)。
解释也是谎言。这是一个异想天开的幻想之地,预计会在几秒钟内渲染几行文字,但当 Explain
被删除时,它会根据地面的现实情况改变路线。
我可以在 movies_actors_salaries
中有 1 行与您的连接匹配,使用索引会建议 mas
使用它,但我向您保证这不是因为这个Manual Page摘录:
Indexes are less important for queries on small tables, or big tables where report queries process most or all of the rows. When a query needs to access most of the rows, reading sequentially is faster than working through an index. Sequential reads minimize disk seeks, even if not all the rows are needed for the query.
所以你可以走了。请密切关注Explain
行计数以及文件排序和临时警告的使用。
关于mysql - JOIN 不以可预测的方式使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33108013/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!