成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

長達(dá) 1.7 萬字的 Explain 關(guān)鍵字指南!

數(shù)據(jù)庫 其他數(shù)據(jù)庫
在我們所執(zhí)行的 SQL 前面加上 explain 關(guān)鍵字,MySQL 就不會真正去執(zhí)行這條語句,而是模擬優(yōu)化器執(zhí)行 SQL 查詢語句,最后會輸出一系列的指標(biāo)告訴我們這條語句的性能如何,如下圖所示。

當(dāng)你的數(shù)據(jù)里只有幾千幾萬,那么 SQL 優(yōu)化并不會發(fā)揮太大價值,但當(dāng)你的數(shù)據(jù)里去到了幾百上千萬,SQL 優(yōu)化的價值就體現(xiàn)出來了!因此稍微有些經(jīng)驗的同學(xué)都知道,怎么讓 MySQL 查詢語句又快又好是一件很重要的事情。要讓 SQL 又快又好的前提是,我們知道它「病」在哪里,而 explain 關(guān)鍵字就是 MySQL 提供給我們的一把武器!

在我們所執(zhí)行的 SQL 前面加上 explain 關(guān)鍵字,MySQL 就不會真正去執(zhí)行這條語句,而是模擬優(yōu)化器執(zhí)行 SQL 查詢語句,最后會輸出一系列的指標(biāo)告訴我們這條語句的性能如何,如下圖所示。

mysql> explain select * from student where id = 1 \G
******************************************************
id: 1
select_type: SIMPLE
table: subject
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL
******************************************************

總的來說,explain 關(guān)鍵字可以告訴我們下面這么多信息:

  1. 表的讀取順序如何
  2. 數(shù)據(jù)讀取操作有哪些操作類型
  3. 哪些索引可以使用
  4. 哪些索引被實際使用
  5. 表之間是如何引用
  6. 每張表有多少行被優(yōu)化器查詢 ......

今天,我們就來介紹 explain 關(guān)鍵字的各個指標(biāo)的含義。系好安全帶,準(zhǔn)備發(fā)車了!

為了方便講解,這里新建了幾張表,并初始化了一些數(shù)據(jù)(建表語句見附錄)。這些表的關(guān)系如下:

  • 一共有老師、學(xué)生、課程三個實體,分別為:teacher、student、course。
  • 三個實體間的關(guān)系分別為:老師教學(xué)生的關(guān)系(teacher_student)、學(xué)生的課程分?jǐn)?shù)(student_course)。

ID 字段

ID 字段的值及其排列順序,表明 MySQL 執(zhí)行時從各表取數(shù)據(jù)的順序。一般情況下遵循下面兩個原則:

  • ID 相同的組,其執(zhí)行優(yōu)先級按照其順序由上到下。
  • ID 越大的組,其執(zhí)行優(yōu)先級越高。

對于下面這個例子:

EXPLAIN SELECT
teacher.*
FROM
teacher,
teacher_student
WHERE
teacher_student.student_name = 's001'
AND teacher.NAME = teacher_student.teacher_name

該例子的輸出為:

圖片

上面的輸出一共有 2 條記錄,其 ID 都為 1,這表示其歸為一組。對于 ID 相同的組,MySQL 按照順序從上到下執(zhí)行,即:先拿 teacher_student 表的數(shù)據(jù),再拿 teacher 表的數(shù)據(jù)。

再來看下面這個例子:

EXPLAIN SELECT
*
FROM
teacher
WHERE
NAME IN ( SELECT teacher_name FROM teacher_student WHERE student_name = 'S002' )

該例子的輸出為:

圖片

上面的輸出一共有 3 條記錄,其中第 1、2 條的 ID 相同,第 3 條 ID 不同。那么其執(zhí)行順序就是 ID 值越大,其越早執(zhí)行。ID 相同的,按順序執(zhí)行。上面的例子,最早拿 teacher_student 表的數(shù)據(jù),之后是一個子查詢組成的表,最后拿 teacher 表的數(shù)據(jù)。結(jié)合 SQL 分析,這也符合我們的常識。因為我們必須先把子查詢的值算出來,因此需要先把 teacher_student 表里的數(shù)據(jù)拿出來,之后才可以拿去 teacher 表里查詢。

select_type 字段

select_type 字段表示該 SQL 是什么查詢類型,一共有以下 6 種:

  • SIMPLE:簡單查詢,不包含子查詢或 union 查詢
  • PRIMARY:主鍵查詢
  • SUBQUERY:在 select 或 where 中包含子查詢
  • DERIVED:from 中包含子查詢
  • UNION:
  • UNION RESULT

SIMPLE

簡單查詢,不包含子查詢或 union 查詢。

-- 查詢T001老師都教了哪些學(xué)生
EXPLAIN SELECT
student.*
FROM
teacher,
teacher_student,
student
WHERE
teacher.NAME = 'T001'
AND teacher.NAME = teacher_student.teacher_name
AND teacher_student.student_name = student.NAME

圖片

可以看出其 3 個查詢都是簡單(SIMPLE)查詢。因為 ID 相同,所以其查詢順序是按順序來的。首先從 teacher 表中取出數(shù)據(jù),之后從 student 表取出數(shù)據(jù),最后 teacher_student 表取數(shù)據(jù)。

PRIMARY

一般情況下,如果查詢中包含了任何復(fù)雜的子查詢,那么最外層查詢會被標(biāo)記為主查詢。

-- PRIMARY 查詢哪些老師教授了選修數(shù)學(xué)課的學(xué)生
EXPLAIN SELECT
*
FROM
teacher
WHERE
NAME IN ( SELECT teacher_name FROM teacher_student WHERE student_name = ( SELECT student_name FROM student_course WHERE course_name = 'shuxue' ) )

在上面的查詢中,首先是執(zhí)行 ID 為 3 的查詢,即去 student_course 表取出選修了數(shù)學(xué)課的學(xué)生名字,之后再去進(jìn)行最外層的查詢。可以看到最外層查詢的 select_type 為 PRIMARY。

SUBQUERY

在 select 或 where 中包含子查詢,那么 select_type 會被標(biāo)記為 SUBQUERY。以上面的查詢?yōu)槔?/p>

-- PRIMARY 查詢哪些老師教授了選修數(shù)學(xué)課的學(xué)生
EXPLAIN SELECT
*
FROM
teacher
WHERE
NAME IN ( SELECT teacher_name FROM teacher_student WHERE student_name = ( SELECT student_name FROM student_course WHERE course_name = 'shuxue' ) )

在該查詢中,where 中包含了子查詢,因此在 explain 中有一個 ID 為 3 的查詢被標(biāo)記為 SUBQUERY。

DERIVED

在 FROM 中包含子查詢,那么 select_type 會被標(biāo)記為 SUBQUERY。

UNION

類似包含 union 關(guān)鍵字的會被標(biāo)記成 UNION 類型,這種查詢方式比較少,這里不做深入講解。

UNION RESULT

類似包含 union 關(guān)鍵字的會被標(biāo)記成 UNION RESULT 類型,這種查詢方式比較少,這里不做深入講解。

type 字段

type 字段表示訪問情況,通常用來衡量 SQL 的查詢效率。其值的查詢效率從最好到最差分別為:

  • NULL
  • system
  • const
  • eq_ref
  • ref
  • fulltext
  • ref_or_null
  • index_merge
  • unique_subquery
  • index_subquery
  • range
  • index
  • ALL

NULL

NULL 表示 MySQL 能夠在優(yōu)化階段分解查詢語句,在執(zhí)行階段用不著再訪問表或索引。

explain select max(id) from teacher

system

表只有一行記錄(等于系統(tǒng)表),這是 const 類型的特列。

出現(xiàn)的情況較少,這里不深入介紹。

const

const 表示該表最多有一個匹配記錄。

通常情況下是 SQL 中出現(xiàn)了主鍵索引或唯一索引。

explain select * from teacher where name = 'T002'

上面例子中,teacher.name 字段為唯一索引字段,所以通過該字段只能唯一找到一條記錄,因此其 type 類型為 const。

eq_ref

eq_ref 表示主鍵索引或唯一索引的所有部分被連接使用 ,最多只會返回一條符合條件的記錄。

與 const 類型非常相似,唯一的區(qū)別是 eq_ef 通常出現(xiàn)在聯(lián)表的情況下,而 const 通常出現(xiàn)在單表情況下。

EXPLAIN SELECT
*
FROM
teacher,
teacher_student
WHERE
teacher.NAME = teacher_student.teacher_name

從上面的執(zhí)行結(jié)果可以看出,其首先全表掃描了 teacher_student 表,之后使用 teacher.name 唯一索引去將聯(lián)合 teacher 表的每一條記錄。

要注意的是,eq_ref 這種情況重點在于:讀取本表中和關(guān)聯(lián)表表中的每行組合成的一行。 如果并沒有關(guān)聯(lián)表中每行這個概念,那么就不會出現(xiàn) eq_ref 這種類型。例如我在上面的 SQL 中加上 age 為 24 這個條件,即 SQL 為:

EXPLAIN SELECT
*
FROM
teacher,
teacher_student
WHERE
teacher.NAME = teacher_student.teacher_name and teacher.age = 24

執(zhí)行計劃變?yōu)椋?/p>

會看到 type 類型都變?yōu)?ref 了,eq_ref 消失了。

ref

ref 表示使用了非唯一索引掃描,會返回匹配某個單獨值的所有行。

與 const 非常類似,只不過 ref 會匹配到多個記錄,而 const 則只會匹配到單個記錄。

explain select * from teacher where age = 24

age 為普通索引,表中有 2 條記錄。

表中數(shù)據(jù)為:

ref_or_null

類似 ref,但是可以搜索值為 NULL 的行。

explain select * from teacher where age = 24 or age is null

當(dāng)我們增加 age is null? 查詢條件后,其 type 字段就變成了 ref_or_null。

index_merge

表示使用了索引合并的優(yōu)化方法。

索引合并指的是:對多個索引分別進(jìn)行條件掃描,然后將它們各自的結(jié)果進(jìn)行合并。

EXPLAIN SELECT * from teacher where id = 1 or age = 24

執(zhí)行計劃為:

可以看到使用了 index_merge 的查詢類型。在 teacher 表中 id 和 age 都是索引,其將兩個字段的索引結(jié)果進(jìn)行合并了。

range

range 表示檢索給定范圍的行,使用一個索引來選擇行,key 列顯示使用了哪個索引。

一般就是在你的 where 語句中出現(xiàn) between、<>、in 等的范圍查詢。

EXPLAIN SELECT * FROM TEACHER where age between 10 and 20

執(zhí)行計劃為:

上面語句中,我們使用 between 進(jìn)行范圍查詢,因此 type 類型為 range。

index

index 表示只遍歷索引樹,且只從索引樹中獲取數(shù)據(jù)。

EXPLAIN SELECT id, age FROM TEACHER

上面 SQL 中的 id、age 都是索引字段,可以直接從索引樹中讀取。因此其 type 字段為 index,表示此次查詢數(shù)據(jù)可以直接從索引樹獲取到。但是如果查詢的字段不在索引樹中,那么就是全表掃描了。例如:

EXPLAIN SELECT id, enter_time FROM TEACHER

查詢 SQL 的 enter_time 字段不是索引,所以上面的查詢就變成了全表查詢(ALL)。

ALL

ALL 表示該查詢將遍歷全表以找到匹配行,這是最糟糕的一種查詢方式。

table 字段

表示數(shù)據(jù)來自哪張表

possible_keys 字段

顯示可能應(yīng)用在這張表中的索引,一個或多個。

查詢涉及到的字段若存在索引,則該索引將被列出,但不一定被實際使用。

key 字段

實際使用到的索引,如果為 NULL,則沒有使用索引。

查詢中若使用了覆蓋索引(查詢的列剛好是索引),則該索引僅出現(xiàn)在 key 列表。

select * from teacher where name = 'T001'

上面這個查詢中,key 字段顯示使用了 udx_name 這個索引,也就是 name 這個字段作為索引。

key_len 字段

這一列顯示了 mysql 在索引里使用的字節(jié)數(shù),通過這個值可以算出具體使用了索引中的哪些列。舉例來說,film_actor 的聯(lián)合索引 idx_film_actor_id 由 film_id 和 actor_id 兩個 int 列組成,并且每個 int 是 4 字節(jié)。通過結(jié)果中的 key_len=4 可推斷出查詢使用了第一個列:film_id 列來執(zhí)行索引查找。

mysql> explain select * from film_actor where film_id = 2;
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+-------------+
| 1 | SIMPLE | film_actor | ref | idx_film_actor_id | idx_film_actor_id | 4 | const | 1 | Using index |
+----+-------------+------------+------+-------------------+-------------------+---------+-------+------+-------------+

key_len 計算規(guī)則如下:

字符串

  • char (n):n 字節(jié)長度
  • varchar (n):2 字節(jié)存儲字符串長度,如果是 utf-8,則長度 3n + 2

數(shù)值類型

  • tinyint:1 字節(jié)
  • smallint:2 字節(jié)
  • int:4 字節(jié)
  • bigint:8 字節(jié)

時間類型

  • date:3 字節(jié)
  • timestamp:4 字節(jié)
  • datetime:8 字節(jié)

其他

如果字段允許為 NULL,需要 1 字節(jié)記錄是否為 NULL

ref 字段

這一列顯示了在 key 列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),func,NULL,字段名(例:film.id)。

rows 列

這一列是 mysql 估計要讀取并檢測的行數(shù),注意這個不是結(jié)果集里的行數(shù)。

Extra 列

這一列展示的是額外信息。

distinct

一旦 mysql 找到了與行相聯(lián)合匹配的行,就不再搜索了。

mysql> explain select distinct name from film left join film_actor on film.id = film_actor.film_id;
+----+-------------+------------+-------+-------------------+-------------------+---------+--------------+------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+-------------------+-------------------+---------+--------------+------+------------------------------+
| 1 | SIMPLE | film | index | idx_name | idx_name | 33 | NULL | 3 | Using index; Using temporary |
| 1 | SIMPLE | film_actor | ref | idx_film_actor_id | idx_film_actor_id | 4 | test.film.id | 1 | Using index; Distinct |
+----+-------------+------------+-------+-------------------+-------------------+---------+--------------+------+------------------------------+

Using index

這表示查找某個表的時候,所需要的信息直接從索引就可以拿到,而不需要再訪問行記錄。

mysql> explain select id from film order by id;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | film | index | NULL | PRIMARY | 4 | NULL | 3 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

上面例子中,我只是選擇了 id 列,這個列本身是索引,其信息直接在索引樹中就可以拿到,因此不需要再訪問行記錄。

Using where

mysql 服務(wù)器將在存儲引擎檢索行后再進(jìn)行過濾。就是先讀取整行數(shù)據(jù),再按 where 條件進(jìn)行檢查,符合就留下,不符合就丟棄。

mysql> explain select * from film where id > 1;
+----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+
| 1 | SIMPLE | film | index | PRIMARY | idx_name | 33 | NULL | 3 | Using where; Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+

Using temporary

mysql 需要創(chuàng)建一張臨時表來處理查詢。出現(xiàn)這種情況一般是要進(jìn)行優(yōu)化的,首先是想到用索引來優(yōu)化。

1. actor.name沒有索引,此時創(chuàng)建了張臨時表來distinct
mysql> explain select distinct name from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+
| 1 | SIMPLE | actor | ALL | NULL | NULL | NULL | NULL | 2 | Using temporary |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------+

2. film.name建立了idx_name索引,此時查詢時extra是using index,沒有用臨時表
mysql> explain select distinct name from film;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | film | index | idx_name | idx_name | 33 | NULL | 3 | Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

Using filesort

MySQL 中無法利用索引完成的排序操作稱為「文件排序」。

在 MySQL 中的 ORDER BY 有兩種排序?qū)崿F(xiàn)方式:

  1. 利用有序索引獲取有序數(shù)據(jù)
  2. 文件排序

在 explain 中分析查詢的時候,利用有序索引獲取有序數(shù)據(jù)顯示 Using index ,文件排序顯示 Using filesort。至于什么時候使用索引排序,什么時候使用文件排序,這個問題太過于復(fù)雜,這里不做深入介紹。

1. actor.name未創(chuàng)建索引,會瀏覽actor整個表,保存排序關(guān)鍵字name和對應(yīng)的id,然后排序name并檢索行記錄
mysql> explain select * from actor order by name;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | actor | ALL | NULL | NULL | NULL | NULL | 2 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+

2. film.name建立了idx_name索引,此時查詢時extra是using index
mysql> explain select * from film order by name;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | film | index | NULL | idx_name | 33 | NULL | 3 | Using index |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

建表語句

建表語句如下:

/*
Navicat Premium Data Transfer

Source Server : localhost
Source Server Type : MySQL
Source Server Version : 80019
Source Host : localhost:3306
Source Schema : test

Target Server Type : MySQL
Target Server Version : 80019
File Encoding : 65001

Date: 22/06/2020 08:59:15
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `udx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of course
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (2, 'shuxue');
INSERT INTO `course` VALUES (3, 'yingyu');
INSERT INTO `course` VALUES (1, 'yuwen');
COMMIT;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `udx_name` (`name`),
UNIQUE KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of student
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (1, 'S001', 24);
INSERT INTO `student` VALUES (2, 'S002', 23);
INSERT INTO `student` VALUES (3, 'S003', 22);
COMMIT;

-- ----------------------------
-- Table structure for student_course
-- ----------------------------
DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`id` int NOT NULL AUTO_INCREMENT,
`student_name` varchar(20) DEFAULT NULL,
`course_name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_student_name` (`student_name`),
KEY `idx_course_name` (`course_name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of student_course
-- ----------------------------
BEGIN;
INSERT INTO `student_course` VALUES (1, 'S001', 'yuwen');
INSERT INTO `student_course` VALUES (2, 'S001', 'shuxue');
INSERT INTO `student_course` VALUES (3, 'S001', 'yingyu');
INSERT INTO `student_course` VALUES (4, 'S002', 'yuwen');
INSERT INTO `student_course` VALUES (5, 'S002', 'shuxue');
INSERT INTO `student_course` VALUES (6, 'S003', 'yuwen');
COMMIT;

-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`enter_time` datetime DEFAULT NULL,
`age` int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `udx_name` (`name`),
KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of teacher
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES (1, 'T001', '2020-06-16 21:51:54', 12);
INSERT INTO `teacher` VALUES (2, 'T002', '2020-06-15 21:52:02', 12);
INSERT INTO `teacher` VALUES (3, 'T003', '2020-06-14 21:52:08', 24);
INSERT INTO `teacher` VALUES (4, 'T004', '2020-06-14 21:52:08', 24);
COMMIT;

-- ----------------------------
-- Table structure for teacher_student
-- ----------------------------
DROP TABLE IF EXISTS `teacher_student`;
CREATE TABLE `teacher_student` (
`id` int NOT NULL AUTO_INCREMENT,
`teacher_name` varchar(20) DEFAULT NULL,
`student_name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_teacher_name` (`teacher_name`),
KEY `idx_student_name` (`student_name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- ----------------------------
-- Records of teacher_student
-- ----------------------------
BEGIN;
INSERT INTO `teacher_student` VALUES (1, 'T001', 'S001');
INSERT INTO `teacher_student` VALUES (2, 'T001', 'S002');
INSERT INTO `teacher_student` VALUES (3, 'T001', 'S003');
INSERT INTO `teacher_student` VALUES (4, 'T002', 'S001');
INSERT INTO `teacher_student` VALUES (5, 'T002', 'S002');
INSERT INTO `teacher_student` VALUES (6, 'T003', 'S001');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

參考資料

  • 一張圖徹底搞懂 MySQL 的 explain - 個人文章 - SegmentFault 思否
  • MySQL explain 詳解 - butterfly100 - 博客園?
責(zé)任編輯:武曉燕 來源: 樹哥聊編程
相關(guān)推薦

2023-11-10 09:29:30

MySQLExplain

2025-03-12 10:55:30

2025-01-24 14:57:24

2010-02-02 14:27:54

C++ static關(guān)

2011-12-22 11:04:19

PhoneGap AP指南Keyword Ind

2022-02-17 08:31:38

C語言staic關(guān)鍵字

2022-05-06 08:32:40

Pythonwith代碼

2021-02-01 13:10:07

Staticc語言UNIX系統(tǒng)

2025-01-09 10:30:40

2023-10-31 12:58:00

TypeScriptJavaScript

2021-03-16 08:21:29

Spark系統(tǒng)并行

2021-01-04 15:42:37

SQL索引Explain

2025-05-13 09:44:24

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2022-11-12 18:32:50

Golangomitemptyjson

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2009-09-02 09:24:03

C# this關(guān)鍵字

2012-03-01 12:50:03

Java

2009-08-21 14:58:56

C# this關(guān)鍵字
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久天天综合 | 99精品视频免费观看 | 中文字幕亚洲欧美日韩在线不卡 | 久久久久久久av麻豆果冻 | 日韩欧美在线视频 | 中文字幕 国产精品 | 一区二区日韩 | 国产精品久久久久久久午夜片 | 在线中文视频 | 色网站在线免费观看 | 欧美黑人体内she精在线观看 | 亚洲网站在线播放 | 亚洲国产成人精 | 粉嫩一区二区三区性色av | 久久精品亚洲一区 | 搞黄网站在线观看 | 国产91久久久久 | 欧美日本一区二区 | 黄视频免费在线 | 伊人久久大香线 | 中文字幕在线观看一区 | 日本黄色片免费在线观看 | 在线观看h视频 | 久久免费福利 | 午夜精品久久久久久久 | 91在线导航| 欧美黑人体内she精在线观看 | 伊人热久久 | 91中文字幕在线观看 | 欧美一区二区久久 | 午夜天堂 | 亚洲精品久久久久久国产精华液 | 日韩一级精品视频在线观看 | 色欧美片视频在线观看 | 久久免费小视频 | 免费在线a视频 | 日韩在线一区二区三区 | 老司机精品福利视频 | 成人精品一区二区三区中文字幕 | 成人欧美一区二区三区黑人孕妇 | 一级黄色短片 |