我正在阅读这篇文章,我正在尝试理解这个SQL语句,但我仍然对SQL有些新意.
我不确定评论和c是什么意思.
我认为其中一个是表名,但我不确定另一个.此外,显然其中有一个子查询,我没有任何经验:
SELECT c.id, c.user_id, c.body, c.deep, c.lineage, c.parent_id,
(SELECT COUNT(*)
FROM comment
WHERE comment.lineage LIKE (CONCAT(c.lineage,'%'))
AND comment.lineage != c.lineage) AS replies
FROM comment as c
ORDER BY c.lineage
Run Code Online (Sandbox Code Playgroud) 我有这个查询,只需要3.5秒来获取2条记录.然而,推荐书中有超过10万行,用户为13k,课程为850,考试为2.
SELECT t.*, u.name, f.feedback
FROM testmonials t
INNER JOIN user u ON u.id = t.userid
INNER JOIN courses co ON co.id = t.courseid
LEFT JOIN exam ex ON ex.id = t.exam_id
WHERE t.status = 4
AND t.verfication_required = 'Y'
AND t.verfication_completed = 'N'
ORDER BY t.submissiondate DESC
Run Code Online (Sandbox Code Playgroud)
.解释结果:.
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE co ALL PRIMARY NULL NULL NULL 850 Using temporary; Using filesort
1 SIMPLE t ref CID,nuk_tran_user CID 4 kms.co.id …Run Code Online (Sandbox Code Playgroud) 我试图explain在查询中解释mysql(以两种不同的方式编写),这是表:
create table text_mess(
datamess timestamp(3) DEFAULT 0,
sender bigint ,
recipient bigint ,
roger boolean,
msg char(255),
foreign key(recipient)
references users (tel)
on delete cascade
on update cascade,
primary key(datamess,sender)
)
engine = InnoDB
Run Code Online (Sandbox Code Playgroud)
这是第一种查询类型:
EXPLAIN
select /*!STRAIGHT_JOIN*/datamess, sender,recipient,roger,msg
from text_mess join (select max(datamess)as dmess
from text_mess
where roger = true
group by sender,recipient) as max
on text_mess.datamess=max.dmess ;
Run Code Online (Sandbox Code Playgroud)
这是第二个:
EXPLAIN
select /*!STRAIGHT_JOIN*/datamess, sender,recipient,roger,msg
from (select max(datamess)as dmess
from text_mess
where roger = true
group by sender,recipient) …Run Code Online (Sandbox Code Playgroud) 我正在使用数据库客户端来测试。
使用EXPLAIN ANALYZE:
Hash Join (cost=5.02..287015.54 rows=3400485 width=33) (actual time=0.023..1725.842 rows=3327845 loops=1)
Hash Cond: ((fact_orders.financial_status)::text = (include_list.financial_status)::text)
CTE include_list
-> Result (cost=0.00..1.77 rows=100 width=32) (actual time=0.003..0.004 rows=4 loops=1)
-> ProjectSet (cost=0.00..0.52 rows=100 width=32) (actual time=0.002..0.003 rows=4 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.000 rows=1 loops=1)
-> Seq Scan on fact_orders (cost=0.00..240253.85 rows=3400485 width=38) (actual time=0.006..551.558 rows=3400485 loops=1)
-> Hash (cost=2.00..2.00 rows=100 width=32) (actual time=0.009..0.009 rows=4 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> CTE Scan on …Run Code Online (Sandbox Code Playgroud) sql postgresql query-optimization explain sql-execution-plan
根据MySQL文档,使用where意味着:WHERE子句用于限制哪些行与下一个表匹配或发送到客户端。
据我了解,这意味着如果您的sql语句有where条件,则您的解释中会出现“Using where”额外信息。根据我的经验,这似乎意味着 MySQL 存储引擎发现索引无法覆盖某些列,并且必须检索行数据。例如:
谁能解释一下Using where的真正含义?
我想知道 MySQL 中使用文件排序是什么意思?
explain select * from user order by user_id;
Run Code Online (Sandbox Code Playgroud)
当我使用“order by”时它就会出现。
1,SIMPLE,orderitems,,ALL,,,,,1,100,Using filesort
Run Code Online (Sandbox Code Playgroud)
“使用文件排序”是额外的。谢谢大家!
我有两个查询来获取相同的数据,它们或多或少具有相同的执行时间。
SELECT name AS prog_name,d.chap_name,d.vid_name,d.idvideo FROM program
JOIN (SELECT name AS chap_name,chapter.idprogram, c.vid_name,c.idvideo FROM chapter
JOIN (SELECT a.name AS vid_name, a.idvideo, b.idchapter FROM video a
JOIN (SELECT idvideo,idchapter,x.idchaptervideo FROM chaptervideo
JOIN (SELECT idchaptervideo FROM prescriptionvideo WHERE idprescription=50)x
ON x.idchaptervideo=chaptervideo.idchaptervideo) b
ON b.idvideo=a.idvideo)c
ON c.idchapter=chapter.idchapter) d
ON d.idprogram=program.idprogram
SELECT program.name AS prog_name,chapter.name as chap_name,video.name as vid_name,video.idvideo FROM prescriptionvideo
JOIN chaptervideo ON prescriptionvideo.idchaptervideo=chaptervideo.idchaptervideo
JOIN video on chaptervideo.idvideo=video.idvideo
JOIN chapter on chaptervideo.idchapter=chapter.idchapter
JOIN program on chapter.idprogram=program.idprogram
where idprescription=50
Run Code Online (Sandbox Code Playgroud)
有人可以指导我哪一个更好吗?我在前者的连接之前和后者的连接之后使用了过滤。MySQL 解释显示前者比后者有更多的行扫描。
我是查询优化的新手,所以我承认我还不了解所有内容,但我不明白为什么即使这个简单的查询也没有按预期进行优化。
我的桌子:
+------------------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-----------+------+-----+-------------------+----------------+
| tasktransitionid | int(11) | NO | PRI | NULL | auto_increment |
| taskid | int(11) | NO | MUL | NULL | |
| transitiondate | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+------------------+-----------+------+-----+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
我的索引:
+-----------------+------------+-------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | …Run Code Online (Sandbox Code Playgroud) 有没有什么合适的资源可以让我们完全理解hive生成的解释计划?我曾尝试在 wiki 中搜索它,但找不到完整的指南来理解它。这是 wiki,它简要解释了解释计划的工作原理。但我需要有关如何推断解释计划的更多信息。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain
mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `b` (`b`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
有一个名为 t 的表,它有两个名为 a 和 b 的索引。插入t 100000行数据
mysql> create procedure idata()
begin
declare i int;
set i=1;
while(i<=100000)do
insert into t values(i, i, i);
set i=i+1;
end while;
end;
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
mysql> call idata();
Run Code Online (Sandbox Code Playgroud)
我做了一些实验,一些如下

现在,我想知道;
(1)为什么explain select * from t where …