一次十分故意思的 SQL SEO阅历
我用的数据库是mysql5.6,上面简朴的引见了局景。
文/风过无痕-唐
课程表
create table Course(
c_id int PRIMARY KEY,
name varchar(10)
)
数据100条
教死表:
create table Student(
id int PRIMARY KEY,name varchar(10)
)
数据70000条
教死成就表SC
CREATE table SC(
sc_id int PRIMARY KEY,
s_id int,
c_id int,
score int
)
数据70w条
查询目标:
查找语文考100分的考死
查询语句:
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 )
施行工夫:30248.271s
晕,为何那么缓,先去检察下查询方案:
EXPLAIN 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 )
发明出有效到索引,type齐是ALL,那么尾先念到的便是成立一个索引,成立索引的字段固然是正在where前提的字段。
先给sc表的c_id战score建个索引
CREATE index sc_c_id_index on SC(c_id);
CREATE index sc_score_index on SC(score);
再次施行上述查询语句,工夫为: 1.054s
快了3w多倍,年夜年夜收缩了查询工夫,看去索引能极年夜水平的进步查询服从,建索引很有须要,许多时分皆遗忘建
索引了,数据量小的的时分压根出觉得,那SEO的觉得挺爽。
可是1s的工夫借是太少了,借能停止优化吗,认真看施行方案:
检察优化后的sql:
SELECT
`YSB`.`s`.`s_id` AS `s_id`,
`YSB`.`s`.`name` AS `name`
FROM
`YSB`.`Student` `s`
WHERE
< in_optimizer > (
`YSB`.`s`.`s_id` ,< EXISTS > (
SELECT
1
FROM
`YSB`.`SC` `sc`
WHERE
(
(`YSB`.`sc`.`c_id` = 0)
AND (`YSB`.`sc`.`score` = 100)
AND (
< CACHE > (`YSB`.`s`.`s_id`) = `YSB`.`sc`.`s_id`
)
)
)
)
弥补:那里有网友问怎样检察优化后的语句
办法以下:
正在号令窗心施行
有type=all
根据我之前的念法,该sql的施行的次第该当是先施行子查询
select s_id from SC sc where sc.c_id = 0 and sc.score = 100
耗时:0.001s
获得以下成果:
然后再施行
select s.* from Student s where s.s_id in(7,29,5000)
耗时:0.001s
那样便是相称快了啊,Mysql居然没有是先施行里层的查询,而是将sql优化成了exists子句,并呈现了EPENDENT SUBQUERY,
mysql是先施行中层查询,再施行里层的查询,那样便要轮回70007*8次。
那么改用毗连查询呢?
SELECT s.* from
Student s
INNER JOIN SC sc
on sc.s_id = s.s_id
where sc.c_id=0 and sc.score=100
那里为了从头阐发毗连查询的状况,先临时删除索引sc_c_id_index,sc_score_index
施行工夫是:0.057s
服从有所进步,看看施行方案:
那里有连表的状况呈现,我料想是否是要给sc表的s_id成立个索引
CREATE index sc_s_id_index on SC(s_id);
show index from SC
正在施行毗连查询
工夫: 1.076s,居然工夫借变少了,甚么本果?检察施行方案:
优化后的查询语句为:
SELECT
`YSB`.`s`.`s_id` AS `s_id`,
`YSB`.`s`.`name` AS `name`FROM
`YSB`.`Student` `s`
JOIN `YSB`.`SC` `sc`
WHERE
(
(
`YSB`.`sc`.`s_id` = `YSB`.`s`.`s_id`
)
AND (`YSB`.`sc`.`score` = 100)
AND (`YSB`.`sc`.`c_id` = 0)
)
貌似是先做的毗连查询,再停止的where前提过滤
回到前里的施行方案:
那里是先做的where前提过滤,再做连表,施行方案借没有是牢固的,那么我们先看下尺度的sql施行次第:
一般状况下是先join再停止where过滤,可是我们那里的状况,假如先join,将会有70w条数据收收join做操,因而先施行where
注:相干网站建立本领浏览请移步到建站教程频讲。
相关信息
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|