DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁SEO優化 >> SEO優化集錦 >> 一次非常有意思的 SQL 優化經歷
一次非常有意思的 SQL 優化經歷
編輯:SEO優化集錦     

場景

我用的數據庫是mysql5.6,下面簡單的介紹下場景。

文/風過無痕-唐

課程表

SQL優化 數據庫優化
create table Course(

c_id int PRIMARY KEY,

name varchar(10)

)
SQL優化 數據庫優化

數據100條

學生表:

SQL優化 數據庫優化
create table Student(

id int PRIMARY KEY,name varchar(10)
)
SQL優化 數據庫優化

數據70000條

學生成績表SC

SQL優化 數據庫優化
CREATE table SC(
sc_id int PRIMARY KEY,
s_id int,
c_id int,
score int
)
SQL優化 數據庫優化

數據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 )

SQL優化 數據庫優化

發現沒有用到索引,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多倍,大大縮短了查詢時間,看來索引能極大程度的提高查詢效率,建索引很有必要,很多時候都忘記建

索引了,數據量小的的時候壓根沒感覺,這優化的感覺挺爽。

但是1s的時間還是太長了,還能進行優化嗎,仔細看執行計劃:

SQL優化 數據庫優化

查看優化後的sql:

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`
)

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved