|

点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”, h6 }, G- o+ m. A6 c
干货福利,第一时间送达!* D0 U6 F4 d0 l7 o
: H# i! u9 Y. a/ \, W# N
fbhsvof41w164060920932.png
. t/ \9 ^, A4 l/ u% y$ M" H最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,有一部分小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了,建议大家加个星标??,就能第一时间收到推送。; j5 E# V% H4 a# q% r/ ^3 ^$ Z
chkv1hhpucs64060921032.png
- Q/ p S2 T# l6 M作者: 风过无痕的博客 : t8 H# J5 h7 }/ z
cnblogs.com/tangyanbo/p/4462734.html- c) h! \1 ~" c( I: D0 B# ^0 w
场景我用的数据库是mysql5.6,下面简单的介绍下场景" T% D+ m- p3 t6 S( v
课程表
7 p7 x9 G& A9 X7 O; kcreate table Course(4 K% I- T" v7 y; N# @, r( h
c_id int PRIMARY KEY,
+ O; h( B9 I! q1 @( i0 Pname varchar(10)
' N* }$ m: b v' }) f$ B' n)! T/ Y" F& u6 v. s% u
数据100条
5 J+ Q( U+ w# B$ |; n学生表:. z! y6 y8 A s; A2 r9 N/ j/ N
create table Student(2 j4 F% q/ m6 \" F
id int PRIMARY KEY,
7 U: O" I4 Q3 _, ~name varchar(10)2 B* @2 ~+ g4 G6 W" b
)1 {; N* P2 W+ R% V) @
数据70000条
# O2 z s& i) z4 i: t0 F! R学生成绩表SC& `/ Y7 ^ t/ i0 A0 |. n4 ?
CREATE table SC(
" ]" `3 r/ e3 w! `( c7 q: b$ i sc_id int PRIMARY KEY,+ V2 q B, i L3 q, [. B6 e
s_id int,& v% g/ F- Q+ k% Q2 {
c_id int,
' C- q7 `/ T( B4 Q7 U. e) z score int
6 `) Q6 \: J, w( U/ e)$ W) ]% j, _0 a+ y2 o! g
数据70w条
& O( z' z) w2 u( G查询目的:' x5 Q6 w3 s) g3 v+ l; P
查找语文考100分的考生
6 Z8 O$ \! \) r+ q! f查询语句:
5 n/ d+ b- [) Pselect s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )
- m, w) L. j8 c y执行时间:30248.271s7 O. K7 f/ s/ e2 D0 I
晕,为什么这么慢,先来查看下查询计划:0 e3 A: E' E' J: q) U( k% g
EXPLAIN6 l. w5 h/ v& Z! v( u( \
select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 )
( }8 [, s1 O( O% h6 p+ {" m7 T
sorg251mmiu64060921132.png
2 B9 a! Q9 |# v* n+ ?1 [
发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。
% X" c" G; Y4 s2 r0 d+ {先给sc表的c_id和score建个索引
) Z3 {- n8 T# O3 n* ]CREATE index sc_c_id_index on SC(c_id);, {' P1 n8 |" C: u7 T& j" ?
CREATE index sc_score_index on SC(score);" J$ z6 R2 y: t. h
再次执行上述查询语句,时间为: 1.054s
, E0 _. J2 z/ q+ Q j0 c) g快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,建索引很有必要,很多时候都忘记建
/ r5 E: t3 y$ T6 C3 z! F; I0 g索引了,数据量小的的时候压根没感觉,这优化的感觉挺爽。
, l7 K4 K; P7 }1 z但是1s的时间还是太长了,还能进行优化吗,仔细看执行计划:0 k7 o9 e1 f9 d5 n% s6 J
oobr2i5oeoc64060921232.png
3 J J: \6 a5 F- V0 u3 \查看优化后的sql:3 C* P+ F- m5 `
SELECT
- y, {9 `5 N. G9 O L% x# v `YSB`.`s`.`s_id` AS `s_id`,
$ j: B! V" } ^/ m. P4 _ i `YSB`.`s`.`name` AS `name`! q' q: F$ p. q. {) M
FROM
/ O: x4 ?4 `' R4 v" s5 A# P% Z `YSB`.`Student` `s`
3 k8 W) p* x0 O' a' e& |WHERE
) @% B" N4 U# t4 f8 C, }3 l J (; S7 D e$ l7 {2 V: M
`YSB`.`s`.`s_id` , (5 r7 R# P8 m8 ?
SELECT5 o) U, a9 d: l% B( J; _" M: j
1: J' s8 D9 V4 q- c! ~
FROM( Q- }8 P: w2 ^7 `9 s/ D; p
`YSB`.`SC` `sc`2 {* J- C/ q7 e8 W% A6 Q
WHERE
, q2 }+ u' K4 V1 k1 ] (
- B7 x @1 ?; u (`YSB`.`sc`.`c_id` = 0)7 a( K n; e0 j8 l
AND (`YSB`.`sc`.`score` = 100) h4 w7 k/ ?) j3 G7 a- ]9 T
AND (3 v. e: p9 y* R, H
(`YSB`.`s`.`s_id`) = `YSB`.`sc`.`s_id`* d. _( P% ^6 Q# _
)* ~% D$ y- {. k. [' ~0 A1 C9 t/ j
)2 p$ n6 ~; }* p
)% m/ u# J$ d6 Z
)0 G& v4 |6 g. ]5 v7 G; d
补充:这里有网友问怎么查看优化后的语句! O# k2 t. H4 p+ G
方法如下:5 Q' V( M& e2 |
在命令窗口执行 |
|