精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

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

在我們所執(zhí)行的 SQL 前面加上 explain 關(guān)鍵字,MySQL 就不會(huì)真正去執(zhí)行這條語句,而是模擬優(yōu)化器執(zhí)行 SQL 查詢語句,最后會(huì)輸出一系列的指標(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. 哪些索引被實(shí)際使用
  5. 表之間是如何引用
  6. 每張表有多少行被優(yōu)化器查詢 ......

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

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

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

ID 字段

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

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

對(duì)于下面這個(gè)例子:

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

該例子的輸出為:

圖片

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

再來看下面這個(gè)例子:

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ù),之后是一個(gè)子查詢組成的表,最后拿 teacher 表的數(shù)據(jù)。結(jié)合 SQL 分析,這也符合我們的常識(shí)。因?yàn)槲覀儽仨毾劝炎硬樵兊闹邓愠鰜恚虼诵枰劝?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 個(gè)查詢都是簡單(SIMPLE)查詢。因?yàn)?ID 相同,所以其查詢順序是按順序來的。首先從 teacher 表中取出數(shù)據(jù),之后從 student 表取出數(shù)據(jù),最后 teacher_student 表取數(shù)據(jù)。

PRIMARY

一般情況下,如果查詢中包含了任何復(fù)雜的子查詢,那么最外層查詢會(huì)被標(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 會(huì)被標(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 中有一個(gè) ID 為 3 的查詢被標(biāo)記為 SUBQUERY。

DERIVED

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

UNION

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

UNION RESULT

類似包含 union 關(guān)鍵字的會(huì)被標(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 表示該表最多有一個(gè)匹配記錄。

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

explain select * from teacher where name = 'T002'

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

eq_ref

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

與 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 這種情況重點(diǎn)在于:讀取本表中和關(guān)聯(lián)表表中的每行組合成的一行。 如果并沒有關(guān)聯(lián)表中每行這個(gè)概念,那么就不會(huì)出現(xiàn) eq_ref 這種類型。例如我在上面的 SQL 中加上 age 為 24 這個(gè)條件,即 SQL 為:

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

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

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

ref

ref 表示使用了非唯一索引掃描,會(huì)返回匹配某個(gè)單獨(dú)值的所有行。

與 const 非常類似,只不過 ref 會(huì)匹配到多個(gè)記錄,而 const 則只會(huì)匹配到單個(gè)記錄。

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)我們?cè)黾?nbsp;age is null? 查詢條件后,其 type 字段就變成了 ref_or_null。

index_merge

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

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

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

執(zhí)行計(jì)劃為:

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

range

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

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

EXPLAIN SELECT * FROM TEACHER where age between 10 and 20

執(zhí)行計(jì)劃為:

上面語句中,我們使用 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)用在這張表中的索引,一個(gè)或多個(gè)。

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

key 字段

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

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

select * from teacher where name = 'T001'

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

key_len 字段

這一列顯示了 mysql 在索引里使用的字節(jié)數(shù),通過這個(gè)值可以算出具體使用了索引中的哪些列。舉例來說,film_actor 的聯(lián)合索引 idx_film_actor_id 由 film_id 和 actor_id 兩個(gè) int 列組成,并且每個(gè) int 是 4 字節(jié)。通過結(jié)果中的 key_len=4 可推斷出查詢使用了第一個(gè)列: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 計(jì)算規(guī)則如下:

字符串

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

數(shù)值類型

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

時(shí)間類型

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

其他

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

ref 字段

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

rows 列

這一列是 mysql 估計(jì)要讀取并檢測的行數(shù),注意這個(gè)不是結(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

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

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 列,這個(gè)列本身是索引,其信息直接在索引樹中就可以拿到,因此不需要再訪問行記錄。

Using where

mysql 服務(wù)器將在存儲(chǔ)引擎檢索行后再進(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 需要?jiǎng)?chuàng)建一張臨時(shí)表來處理查詢。出現(xiàn)這種情況一般是要進(jìn)行優(yōu)化的,首先是想到用索引來優(yōu)化。

1. actor.name沒有索引,此時(shí)創(chuàng)建了張臨時(shí)表來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索引,此時(shí)查詢時(shí)extra是using index,沒有用臨時(shí)表
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í)候,利用有序索引獲取有序數(shù)據(jù)顯示 Using index ,文件排序顯示 Using filesort。至于什么時(shí)候使用索引排序,什么時(shí)候使用文件排序,這個(gè)問題太過于復(fù)雜,這里不做深入介紹。

1. actor.name未創(chuàng)建索引,會(huì)瀏覽actor整個(gè)表,保存排序關(guān)鍵字name和對(duì)應(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索引,此時(shí)查詢時(shí)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 - 個(gè)人文章 - 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)

2023-10-31 12:58:00

TypeScriptJavaScript

2021-03-16 08:21:29

Spark系統(tǒng)并行

2021-02-01 13:10:07

Staticc語言UNIX系統(tǒng)

2022-02-17 08:31:38

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

2025-01-09 10:30:40

2022-05-06 08:32:40

Pythonwith代碼

2024-03-15 15:12:27

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

2022-11-12 18:32:50

Golangomitemptyjson

2021-01-04 15:42:37

SQL索引Explain

2011-12-22 11:04:19

PhoneGap AP指南Keyword Ind

2025-05-13 09:44:24

2022-01-04 16:35:42

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

2012-03-01 12:50:03

Java

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2013-01-30 10:12:14

Pythonyield
點(diǎn)贊
收藏

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

国产成人午夜高潮毛片| 日韩精品二区| 狠狠做深爱婷婷久久综合一区| 麻豆传媒一区| 国产毛片一区二区三区va在线| 欧美久久九九| 国产一区二区成人| 毛茸茸free性熟hd| 日韩黄色在线| 日韩欧美亚洲综合| wwwjizzjizzcom| 国产高清视频在线播放| 国产成人激情av| 国产精品久久久久久影视 | 一级α片免费看刺激高潮视频| 欧美va天堂| 一本色道久久综合狠狠躁篇怎么玩 | 久久99国产精品成人| 97人人模人人爽人人喊中文字| 日韩欧美黄色网址| 日日天天久久| 亚洲精品一区二区三区四区高清| 一级黄色特级片| 午夜欧美激情| 亚洲成人动漫在线观看| 国产一二三四区在线观看| 国产理论电影在线观看| 91免费观看国产| 国产美女99p| 99国产精品99| 精品一区二区精品| 国产精品免费视频久久久| 免费观看一区二区三区毛片| 欧美精品一卡| 欧美疯狂性受xxxxx另类| 国产亚洲精品久久久久久豆腐| 亚洲动漫精品| 日韩毛片在线观看| 久久人人妻人人人人妻性色av| 欧美午夜网站| 日韩三级视频中文字幕| 日韩成人av免费| 人人精品久久| 欧美三级日韩三级国产三级| 无码内射中文字幕岛国片| 国产夫妻在线播放| 精品久久久久久久久久| 精品国产一二三四区| 草草影院在线| 亚洲成人精品在线观看| 精品少妇在线视频| √天堂8资源中文在线| 亚洲国产日韩a在线播放| 激情六月天婷婷| 日本在线观看高清完整版| 亚洲卡通欧美制服中文| 无颜之月在线看| 午夜成年人在线免费视频| 一区二区三区在线观看欧美 | 成人在线一级片| 国产一区二区三区四区五区| 亚洲日韩中文字幕| 91成人精品一区二区| 色爱综合网欧美| 欧美精品在线观看91| 欧美被狂躁喷白浆精品| 好看的av在线不卡观看| 国语自产精品视频在线看| 成人免费a视频| 免费人成在线不卡| 92国产精品视频| 熟妇人妻系列aⅴ无码专区友真希| 成人亚洲一区二区一| 久久久精彩视频| 粉嫩av在线播放| 亚洲视频精选在线| 日韩一级性生活片| 亚洲wwww| 欧美一级日韩免费不卡| 美女黄色一级视频| 欧美日韩123| 久久精品亚洲热| 久久精品亚洲无码| 日韩国产在线观看一区| 91丝袜美腿美女视频网站| 丁香花免费高清完整在线播放 | 一二三四视频在线中文| 在线一区二区三区| 91丨porny丨九色| 亚洲区小说区图片区qvod按摩| 国产一区二区三区丝袜| 男人操女人的视频网站| 国产深夜精品| 91美女福利视频高清| 天堂av中文字幕| 国产精品久久久久久久岛一牛影视 | 久久99九九| 日本免费在线视频| 欧美特级www| 天天色天天干天天色| 婷婷成人在线| 欧美乱妇高清无乱码| www.五月婷婷.com| 白白色 亚洲乱淫| 在线国产伦理一区| 亚洲校园激情春色| 日韩视频不卡中文| 日本少妇aaa| 先锋影音久久| 国产精品久久久久久久小唯西川 | 一级国产黄色片| 欧美jizzhd精品欧美巨大免费| 国产成人高清激情视频在线观看 | 水蜜桃色314在线观看| 日本成人在线网站| 国产亚洲视频在线| 国产一级做a爱片久久毛片a| 国产精品白丝jk白祙喷水网站| 欧美在线视频一区二区三区| 欧美1—12sexvideos| 欧美剧在线免费观看网站| 国产精品揄拍100视频| 激情欧美亚洲| 亚洲自拍高清视频网站| 在线看免费av| 欧美视频一区二区| 97人妻精品一区二区免费| 一本久道久久综合狠狠爱| 亚洲最大的av网站| 麻豆传媒视频在线| 欧美色窝79yyyycom| b站大片免费直播| 午夜亚洲一区| 久久99国产精品99久久| а√天堂中文资源在线bt| 欧美大片在线观看一区| 成年人午夜剧场| 激情五月播播久久久精品| 亚洲高清123| 在线一区视频观看| 亚洲视频综合网| 国产黄色免费视频| 国产香蕉久久精品综合网| 鲁一鲁一鲁一鲁一澡| 欧美电影完整版在线观看| 97视频在线观看免费高清完整版在线观看| www.国产.com| 五月激情综合网| 日韩av无码一区二区三区不卡 | 亚洲女人小视频在线观看| 手机在线国产视频| 亚洲色图二区| 粉嫩精品一区二区三区在线观看| 色在线视频网| 日韩大陆毛片av| 永久免费无码av网站在线观看| 91免费版在线看| 中文久久久久久| 久久在线视频免费观看| 国产在线日韩在线| 影音先锋在线播放| 亚洲成人网av| 免费看毛片网站| 欧美精彩视频一区二区三区| 浓精h攵女乱爱av| 亚洲深深色噜噜狠狠爱网站| 亚洲最大的av网站| 成入视频在线观看| 亚洲人成在线观看| 91美女精品网站| 亚洲永久精品国产| 丰满圆润老女人hd| 麻豆极品一区二区三区| 18视频在线观看娇喘| 草莓视频一区二区三区| 日韩av成人在线| 中文日本在线观看| 欧美成人video| 亚洲欧美日韩激情| 亚洲日本一区二区| 少妇精品一区二区| 久久国产免费看| 精品无码国产一区二区三区av| 亚洲自拍都市欧美小说| 国产乱人伦真实精品视频| 在线看福利影| 亚洲性猛交xxxxwww| 国产视频手机在线| 日韩欧美在线观看| 小泽玛利亚一区二区免费| 99r国产精品| 一级网站在线观看| 久久亚洲美女| 国产一线二线三线女| 国产亚洲欧美日韩在线观看一区二区 | 午夜视频在线观看国产| 轻轻草成人在线| 国内精品视频一区二区三区| 成人一区二区| 精品免费二区三区三区高中清不卡| 日韩中文在线播放| 久久久久久伊人| 日韩免费网站| 亚洲欧美色婷婷| 亚洲av无码一区二区三区性色 | 欧美在线观看视频| 老司机在线看片网av| 日韩精品免费一线在线观看| 国产ts变态重口人妖hd| 欧美在线|欧美| 自拍偷拍欧美亚洲| 亚洲一区在线看| 黄色录像一级片| 国产欧美一区二区精品忘忧草| 亚洲av无码专区在线播放中文| 老色鬼精品视频在线观看播放| 女人和拘做爰正片视频| 韩国亚洲精品| 乱熟女高潮一区二区在线| 欧美gayvideo| 色之综合天天综合色天天棕色| 麻豆精品99| 国产欧美日韩亚洲| 伊人www22综合色| 91在线中文字幕| 99精品视频在线免费播放 | 中文字幕一区2区3区| 欧美日韩亚洲成人| 久久视频免费在线观看| 亚洲码国产岛国毛片在线| 亚洲欧美精品久久| 中文字幕av在线一区二区三区| 瑟瑟视频在线观看| 久久蜜臀中文字幕| 少妇户外露出[11p]| 成人av在线播放网址| 国产女主播在线播放| 国产精品亚洲视频| 黑人玩弄人妻一区二区三区| 国产成人亚洲综合a∨婷婷图片 | 久久综合久久综合久久综合| 少妇一级淫免费观看| 国产91精品一区二区麻豆网站| 午夜免费视频网站| 国产剧情av麻豆香蕉精品| 亚洲精品综合在线观看| 国产在线精品一区二区夜色 | 久久久久久久久久久久久国产精品 | 色悠悠在线视频| 成人激情小说网站| 久久久久久久无码| 久久久久久久国产精品影院| 国产美女免费无遮挡| 久久精品视频一区二区| 最新中文字幕av| 国产精品理论在线观看| 天天看天天摸天天操| 亚洲小说欧美激情另类| 国产福利拍拍拍| 在线看一区二区| 国产精品污视频| 欧美成人一区二区三区片免费 | www.久久伊人| 日韩精品在线观看网站| 每日更新av在线播放| 中文字幕在线观看日韩| 七七成人影院| 日本高清久久天堂| 男女啪啪999亚洲精品| 亚洲伊人一本大道中文字幕| 国产suv精品一区二区四区视频| 久久99国产精品99久久| 日本欧美国产| 无码日本精品xxxxxxxxx| 一区二区黄色| 天天干天天操天天玩| 成人网在线免费视频| 免费观看av网站| 中文字幕日韩一区| 男人天堂中文字幕| 欧美另类久久久品| 色一情一乱一乱一区91av| 一本色道久久综合狠狠躁篇怎么玩| 麻豆传媒在线完整视频| 欧美一区二区三区……| 日日夜夜亚洲精品| 精品蜜桃一区二区三区| 99久久九九| 成人一级片网站| 国产精品一区二区黑丝| wwwwww日本| 一区二区三区自拍| 69视频免费看| 精品成人在线观看| 日韩av中文| 日韩美女视频中文字幕| 日韩欧美中文在线观看| 日本在线视频一区| 99香蕉国产精品偷在线观看 | 波多野结衣家庭主妇| 欧美r级在线观看| 午夜精品一区| 国产成人一区三区| 超碰在线一区| 天天做天天爱天天高潮| 天堂蜜桃91精品| 国产精品手机在线观看| 国产精品国产三级国产普通话蜜臀 | 久热精品视频| 性色av蜜臀av浪潮av老女人| 中文字幕一区二区三区不卡在线| 亚洲综合久久网| 亚洲精品美女在线观看播放| 国产不卡在线| 国产日韩av在线播放| 九九视频免费观看视频精品| 91成人在线观看喷潮教学| 国产精品一区二区三区四区| 五月激情四射婷婷| 色婷婷综合中文久久一本| 欧美一区二区公司| 欧美理论电影在线播放| 久久免费福利| 中国一级黄色录像| 美女在线一区二区| 女人黄色一级片| 欧美日韩在线一区二区| 欧美新色视频| 欧洲一区二区视频| 亚洲+变态+欧美+另类+精品| 精品成在人线av无码免费看| 国产一区二区三区免费在线观看| 99re6热在线精品视频| 欧美中文字幕一二三区视频| 欧美69xxxxx| 国产高清在线不卡| 国产探花在线精品| 超碰在线播放91| 国产精品久久综合| 91一区二区视频| 另类天堂视频在线观看| 秋霞一区二区| 国产精品第157页| 成人18视频日本| 国产超碰人人爽人人做人人爱| 亚洲国内精品视频| 伊人久久av| 午夜精品一区二区三区四区| 日韩电影在线免费| 后入内射无码人妻一区| 欧美精品在线观看播放| 成人免费在线| 精品不卡一区二区三区| 亚洲综合欧美| 粉嫩精品久久99综合一区| 欧美日韩电影在线播放| 国产精品va在线观看视色| 5566av亚洲| 亚洲区国产区| 性欧美一区二区| 欧美一级理论片| 黄毛片在线观看| 神马影院一区二区三区| 极品少妇xxxx精品少妇偷拍 | 91久久夜色精品国产九色| 国产精品815.cc红桃| 欧美性生活影院| 香蕉成人app免费看片| 精品视频第一区| 美腿丝袜亚洲综合| 久久久久99精品成人片毛片| 日韩成人av在线| 国产一区精品福利| 欧美久久在线观看| 国产欧美一区二区精品忘忧草 | 国产av人人夜夜澡人人爽麻豆| 91麻豆蜜桃一区二区三区| 亚洲综合五月天婷婷丁香| 久久久久久成人精品| 久9久9色综合| www.日本久久| 日韩欧美一区二区三区| 成人黄色在线电影| 欧美精品123| 国产精品一品视频| 日韩熟女一区二区| 欧美老少做受xxxx高潮| 自拍偷拍精品| 日韩欧美中文视频| 在线看国产一区二区| 都市激情久久综合| 亚洲巨乳在线观看| 91在线观看视频| 国产伦精品一区二区三区四区 | 91精品国产色综合| 亚洲a一区二区三区| 老鸭窝一区二区| 精品少妇一区二区三区视频免付费 | 91成人在线精品| 污污视频在线|