MySQL

04-Explain实战

2021-04-20  本文已影响0人  紫荆秋雪_文

一、实战准备

CREATE TABLE IF NOT EXISTS  `article`(
`id`    INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) UNSIGNED    NOT NULL,
`category_id`   INT(10) UNSIGNED NOT NULL,
`views` INT(10) UNSIGNED NOT NULL,
`comments`  INT(10) UNSIGNED NOT NULL,
`title` VARBINARY(255) NOT NULL,
`context` TEXT NOT NULL
)
INSERT INTO
`article`(`author_id`, `category_id`, `views`, `comments`, `title`, `context`)
VALUES
(1, 1,  1,  1,  '1',    '1'),
(2, 2,  2,  2,  '2',    '2'),
(1, 1,  3,  3,  '3',    '3')

二、使用Explain分析

1、查询 category_id 为1 且 comments 大于 1 的情况下,views 最多的 article_id

EXPLAIN
SELECT 
id,author_id, views, comments
FROM
article
WHERE
category_id = 1
AND
comments > 1 
ORDER BY
views DESC
LIMIT 1
Explain分析结果.png
查看索引
SHOW INDEX  FROM    article
创建索引
CREATE INDEX idx_article_ccv ON article(category_id, comments, views)
删除索引
DROP INDEX idx_article_ccv  ON  article
索引.png
使用索引再次查询 使用索引再次查询.png
修改搜索方式
EXPLAIN
SELECT 
id,author_id, views
FROM
article
WHERE
category_id = 1
AND
comments = 3
ORDER BY
views DESC
LIMIT 1
修改搜索条件.png

小结

2、改进1出现的问题

2.1、删除第一次创建的索引
DROP INDEX idx_article_ccv  ON  article
2.2、重新创建索引
CREATE INDEX idx_article_cv ON article(category_id, views)
idx_article_cv.png
2.3、再次查询
EXPLAIN
SELECT 
id,author_id, views
FROM
article
WHERE
category_id = 1
AND
comments > 1
ORDER BY
views DESC
LIMIT 1
image.png

3、两表实战

3.1、SQL
CREATE TABLE IF NOT EXISTS `class`(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`id`)
)

CREATE TABLE IF NOT EXISTS `book`(
`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`bookid`)
)
3.2、SQL添加数据
INSERT INTO class(card) VALUES(FLOOR(1+(RAND() * 20)))
3.3、Explain分析
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card
两表查询EXPLAIN分析结果.png
3.4、给book创建索引
ALTER TABLE book ADD INDEX idx_book_card (`card`)
3.5、查看索引 book索引.png
3.6、book创建索引情况下再次执行
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card
book加索引的情况下.png
3.7、删除book索引
DROP INDEX idx_book_card    ON  book
3.8、给class添加索引
ALTER TABLE class ADD INDEX idx_class_card (`card`)
class添加索引.png
3.9、class添加索引情况下再次查询
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card
class添加索引.png

小结

4、三表实战

4.1、SQL
CREATE TABLE IF NOT EXISTS `phone`(
`phoneid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`phoneid`)
)
4.2、添加数据
INSERT INTO phone(card) VALUES(FLOOR(1+(RAND() * 20)))
4.3、Explain分析
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card

LEFT JOIN
phone
ON
book.card = phone.card
3表Explain分析.png
4.4、phone表添加索引
ALTER TABLE phone ADD INDEX idx_phone_card (`card`)
4.5、phone表查看索引
SHOW INDEX  FROM    phone
phone表索引.png
4.6、phone表有索引的情况下再次查询
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card

LEFT JOIN
phone
ON
book.card = phone.card

phone表有索引的情况下查询.png
4.7、单独给book表加索引
ALTER TABLE book ADD INDEX idx_book_card (`card`)
SHOW INDEX  FROM    book
book表加索引.png
4.8、单独book表加索引情况下搜索
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card

LEFT JOIN
phone
ON
book.card = phone.card
单独book表加索引情况下搜索.png
4.9、给book表和phone表加索引情况下搜索
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card

LEFT JOIN
phone
ON
book.card = phone.card
phone表和book表加索引.png
4.10、给class表和book表和phone表加索引情况下搜索
EXPLAIN
SELECT
* 
FROM
class
LEFT JOIN
book
ON
class.card = book.card

LEFT JOIN
phone
ON
book.card = phone.card
三张表全都加索引.png

小结:join语句的优化

上一篇 下一篇

猜你喜欢

热点阅读