精品欧美一区二区三区在线观看 _久久久久国色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)

亚洲成av人影院在线观看| 韩国精品福利一区二区三区| 久久精品人人做人人爽97| 国产成人精品优优av| 久久嫩草捆绑紧缚| 91精品久久久久久综合五月天| 亚洲国产成人高清精品| 欧美精品与人动性物交免费看| 最近中文字幕在线免费观看| 欧美激情第10页| 日韩国产精品一区| 午夜xxxxx| 国产自产自拍视频在线观看| 国产视频不卡一区| 国产二区一区| 欧美激情一区二区三区免费观看 | 日韩av一二三区| 日韩一区亚洲二区| 日韩av综合网| 99国产精品免费视频| 亚洲第一会所| 午夜国产不卡在线观看视频| 不卡中文字幕在线| 男女污视频在线观看| 国产成人免费视频一区| 日韩久久免费电影| 手机精品视频在线| 国模一区二区| 欧美日韩国产精品专区| 亚洲国产一二三精品无码| 国产精品主播一区二区| 久久精品主播| 国产性色av一区二区| 特黄特色免费视频| 高清一区二区中文字幕| 欧美色手机在线观看| 日日夜夜精品网站| 亚洲色图另类小说| 国产乱妇无码大片在线观看| 国产精品6699| 午夜婷婷在线观看| 欧美一级淫片| 亚洲视频在线看| 日本丰满少妇裸体自慰| 国产成人精品福利| 精品国精品国产尤物美女| 亚洲热在线视频| 欧美性aaa| 欧美日韩国产小视频在线观看| 亚洲精品一卡二卡三卡四卡| 日本天堂在线| 久久亚洲一区二区三区明星换脸| 成人国产一区二区| 精品国产18久久久久久| 国产乱人伦精品一区二区在线观看| 国产精品一区二区久久| 怡红院成永久免费人全部视频| 久久综合影音| 国产精品久久电影观看| 国产又粗又猛又爽又| 天堂影院一区二区| 国产精品私拍pans大尺度在线| 国产一级一级国产| 日韩国产高清在线| 国产精品一区av| 一级黄色片在线播放| 久久精品国产99国产| 久久久久久国产精品| 久久午夜无码鲁丝片| 自拍偷拍精品| 777亚洲妇女| 欧洲美女亚洲激情| 清纯唯美激情亚洲| 精品人伦一区二区色婷婷| xxxwww国产| 九九久久电影| 精品国产欧美一区二区五十路| 尤物在线免费视频| 极品少妇一区二区三区| 96精品视频在线| 国产主播第一页| 激情六月婷婷久久| 国产精华一区| 男人的天堂在线| 亚洲欧洲av一区二区三区久久| 九一免费在线观看| 高清视频在线观看三级| 欧美视频在线播放| 日本亚洲一区二区三区| 欧美亚洲色图校园春色| 一区二区三区视频免费在线观看 | 国产精品7777777| 久久精品国产清高在天天线| 国产啪精品视频| 免费观看毛片网站| 精品一区二区三区视频在线观看 | 最近看过的日韩成人| 日韩伦理av| 色成人在线视频| 一区二区三区国产好的精华液| 久久中文资源| 日韩有码在线观看| 天堂网av手机版| 美国毛片一区二区三区| 国产免费一区| 国产wwwwwww| 久久综合五月天婷婷伊人| 在线一区日本视频| 伊伊综合在线| 精品日韩av一区二区| jizz18女人高潮| 亚洲高清在线| 18成人在线| av在线播放网站| 99久久免费视频.com| 亚洲欧美日本国产有色| 黄色软件视频在线观看| 91精品国产综合久久久久久漫画| 亚洲国产精品无码久久久久高潮 | 久草国产精品视频| 精品一区二区久久| 蜜桃网站成人| 97人人在线视频| 欧美一级专区免费大片| 国产精品av久久久久久无| 亚洲每日在线| 91麻豆国产语对白在线观看| 精品推荐蜜桃传媒| 久久综合色播五月| 国产精品久久国产| 高清一区二区三区av| 宅男66日本亚洲欧美视频| 天堂网av手机版| 97久久超碰国产精品| 日本成人在线不卡| 国产日本亚洲| 久久久av免费| 国产一区二区小视频| 中文字幕欧美激情| 妓院一钑片免看黄大片| gogo亚洲高清大胆美女人体| 亚洲第一av网站| 九九视频免费看| 国产精品一区二区三区网站| 宅男在线精品国产免费观看| 久久xxx视频| 亚洲天堂一区二区三区| 日本中文字幕久久| 久久婷婷久久一区二区三区| 国自产拍偷拍精品啪啪一区二区 | 国产精品久久久av| 国产三级电影在线观看| 在线亚洲一区二区| av电影在线不卡| 久久久久综合| 先锋影音一区二区三区| 日韩av首页| 色噜噜久久综合伊人一本| 在线观看xxxx| 亚洲美女视频在线| 中文字幕人妻熟女在线| 亚洲二区视频| 日韩av一级大片| 成人国产激情| 久久久国产一区二区| 99热这里只有精| 亚洲第一在线综合网站| 毛茸茸多毛bbb毛多视频| 天堂va蜜桃一区二区三区漫画版| 午夜一区二区三区| 亚洲欧美日本国产| 午夜免费久久久久| 美丽的姑娘在线观看免费动漫| 在线亚洲人成电影网站色www| 精品一区二区6| 国产精品影视在线观看| 国产高清av在线播放| 亚洲欧洲色图| 91精品国产自产在线老师啪| 丝袜中文在线| 亚洲天堂av综合网| a在线观看视频| 五月天中文字幕一区二区| 女~淫辱の触手3d动漫| 麻豆成人91精品二区三区| 香蕉视频在线网址| 超碰成人福利| 国产精品美女www爽爽爽视频| 美女免费久久| 亚洲精品美女免费| 911美女片黄在线观看游戏| 亚洲综合在线第一页| 国产又粗又长又大的视频| 希岛爱理av一区二区三区| 国产视色精品亚洲一区二区| 99精品在免费线偷拍| 欧美多人爱爱视频网站| 国产爆初菊在线观看免费视频网站| 欧美猛男gaygay网站| 国产成人在线播放视频| 中文字幕一区二区三区不卡| 午夜男人的天堂| 午夜欧美精品久久久久久久| 久久久久网址| 日本一区二区三区视频在线看| 欧美一级片在线播放| 中文在线观看免费| 国产一区二区欧美日韩| 内射无码专区久久亚洲| 欧美日韩国产123区| 麻豆久久久久久久久久| 一区二区三区免费在线观看| 精品一区二区三区蜜桃在线| 成人动漫在线一区| 国产在线视频三区| 久久99久久久久久久久久久| 国产日产欧美视频| 亚洲第一黄色| 久久www视频| 久久一区二区三区喷水| 国产欧美一区二区三区久久人妖 | 我不卡影院28| 无遮挡亚洲一区| 竹菊久久久久久久| 久久久久久久久久久久久久久久av | 欧美成人一区在线| av在线电影免费观看| 亚洲人成网站色ww在线| 香蕉视频成人在线| 亚洲成人网av| 黄色福利在线观看| 精品久久人人做人人爱| 国产高清免费av| 在线综合亚洲欧美在线视频| 夜夜狠狠擅视频| 欧美色男人天堂| 日本精品入口免费视频| 色八戒一区二区三区| 69亚洲精品久久久蜜桃小说| 欧美日韩免费区域视频在线观看| 国产一级片播放| 91香蕉国产在线观看软件| 欧美aⅴ在线观看| 欧美日韩第一| 成人xxxx视频| 亚洲精品大片| 成人av电影天堂| 小说区图片区亚洲| 91亚洲人电影| 999在线精品| 国产在线精品一区二区三区》 | 国产一级一片免费播放放a| 亚洲精品视频一区二区| 精品97人妻无码中文永久在线 | 日日夜夜操视频| 在线精品视频小说1| 日本欧美www| 欧美精品精品一区| 亚洲不卡免费视频| 日韩av最新在线| 国产在线网站| 久久精品国产清自在天天线| www在线免费观看视频| 欧美二区在线播放| 色偷偷色偷偷色偷偷在线视频| 欧日韩在线观看| 国产最新在线| 欧美久久精品午夜青青大伊人| 国产成人精品a视频| 欧美一三区三区四区免费在线看 | 久久最新免费视频| 欧美大胆视频| 欧美中日韩免费视频| 色无极亚洲影院| 日本一道在线观看| 国产女优一区| 999在线观看| 成人午夜激情视频| 日韩一级av毛片| 综合久久给合久久狠狠狠97色| 久久精品美女视频| 日本久久一区二区| 国产xxxx孕妇| 国产视频自拍一区| 国产一二区在线观看| 午夜精品一区二区三区在线播放| 日本综合视频| 国产99在线播放| 欧美限制电影| 免费 成 人 黄 色| 久久se这里有精品| 五十路六十路七十路熟婆| 国产精品全国免费观看高清| 国产真实乱偷精品视频| 欧洲精品视频在线观看| 亚洲伦理在线观看| 视频在线观看99| 极品美鲍一区| 91gao视频| 欧美三级情趣内衣| 免费看欧美黑人毛片| 日韩精品一级二级| 亚洲一级Av无码毛片久久精品| 中文字幕不卡在线播放| 欧美成人aaaaⅴ片在线看| 欧美亚洲综合在线| 无码精品视频一区二区三区| 久久久精品一区| 日韩大片欧美大片| 国产一区二区三区四区hd| 国产精品videosex性欧美| 黄色片久久久久| 成人网在线播放| 久草视频手机在线| 欧美伊人精品成人久久综合97| 五月婷婷免费视频| 欧美福利视频在线| 在线高清欧美| 91精品视频免费观看| 国产日韩视频在线| 国产老熟妇精品观看| 国产69精品久久久久777| 视频国产一区二区| 欧美性一级生活| 欧美日韩国产综合视频| 国内精品在线一区| 51精品国产| 无码人妻精品一区二区蜜桃百度| 久久国内精品自在自线400部| 能免费看av的网站| 中文字幕精品一区二区三区精品| 伊人手机在线视频| 亚洲国产天堂网精品网站| 手机av免费在线| 亚洲字幕一区二区| 亚洲五月综合| 国产又粗又长又爽又黄的视频| 国产精品欧美经典| 一区二区自拍偷拍| 色偷偷噜噜噜亚洲男人| 黄色成人在线观看网站| 99国精产品一二二线| 91高清一区| 亚洲高清在线不卡| 亚洲欧美精品午睡沙发| 国产日韩精品suv| 欧美巨猛xxxx猛交黑人97人| 欧美视频三区| 国产一区二区三区小说| 懂色av噜噜一区二区三区av| 毛片a片免费观看| 欧美精品一区二区三区一线天视频| 男人天堂综合| 国产精品久久久久久久av电影| 精品国产aⅴ| 欧美日韩中文不卡| 亚洲日穴在线视频| 国产黄a三级三级看三级| 欧美国产日韩视频| 女一区二区三区| 毛片一区二区三区四区| 欧美激情一区二区三区全黄| 久久免费黄色网址| 亚洲国产日韩欧美在线动漫| 在线人成日本视频| 视频二区一区| 国内精品免费**视频| 久久久久久久国产视频| 日韩福利在线播放| 成人全视频在线观看在线播放高清| 亚洲一区二区四区| 国产成人综合精品三级| av中文在线播放| 正在播放亚洲1区| 日韩黄色av| 春日野结衣av| 国产精品高清亚洲| 亚洲黄色小说网| 日韩免费精品视频| 一区二区影院| 人妻丰满熟妇aⅴ无码| 欧美图片一区二区三区| 羞羞视频在线观看不卡| 久久综合九色欧美狠狠| 美国三级日本三级久久99| 国产主播在线播放| 日韩视频中文字幕| 乱亲女h秽乱长久久久| 三级视频中文字幕| 亚洲国产精品久久人人爱蜜臀| 精品999视频| 成人国产1314www色视频| 日韩在线一区二区三区| 久久久久噜噜噜亚洲熟女综合| 亚洲品质视频自拍网| 136国产福利精品导航网址应用| 粗暴91大变态调教| 久久精品视频免费| www.香蕉视频| 国产精品午夜一区二区欲梦|