MySQL 索引優化案例

2021-10-02 11:44:05 字數 2773 閱讀 6320

建表

create

table article(

id int

unsigned

notnull

primary

keyauto_increment

,author_id int

unsigned

notnull

,category_id int

unsigned

notnull

,views int

unsigned

notnull

,comments int

unsigned

notnull

,title varchar

(255

)not

null

,content text

notnull

);

插入資料

insert

into article(

`author_id`

,`category_id`

,`views`

,`comments`

,`title`

,`conte

nt`)

values(1

,1,1

,1,'1'

,'1'),

(2,2

,2,2

,'2'

,'2'),

(1,1

,3,3

,'3'

,'3'

);

現在比如說我們要查詢category_id為1且comments大於1的情況下,views最多的article_id

我們要完成這個功能應該使用的sql語句為

select

*from article where category_id =

1and comments>

1order

by views desc

limit

1;

我們使用explain分析這條sql語句發現出現了using filesort,說明mysql使用了外部的索引排序,這是不好的,

我們應該通過新增索引來優化他,那麼這個索引應該新增到哪個列上呢。

前面講過使用索引查詢時範圍之後全失效。所以不能新增在comments這個列上,那我們嘗試著新增在category_id和views上。再進行explain語句分析

發現using filesort沒了,那麼便是新增的索引有效了。

建表

商品類別

create

table class(

id int

unsigned

notnull

primary

keyauto_increment

, card int

unsigned

notnull);

圖書表create

table book(

bookid int

unsigned

notnull

auto_increment

primary

key,

card int

unsigned

notnull

);

新增資料

在mysql中rand函式表示生成隨機小數,floor表示將數向下取整

insert

into class values(0

,floor(rand()*

100));

insert

into book values(0

,floor(rand()*

100)

);

我們將這兩條資料分別執行20次,向兩個表中隨機插入20條資料

現在比如說我們要查詢兩個表中card相同的資料

select

*from class left

join book on class.card = book.card;

並使用explain分析該sql語句,會發現出現了using join buffer,使用了連線快取。那麼我們也得建立索引來進行優化。那麼我們應該在哪個表上建立索引呢。

當使用左連線left join時,應該往右表book上新增索引

create

index idx_book_c on book(card)

;

此時再使用explain分析sql語句發現using join buffer不見了。

同理使用右連線right join時,應該往左表新增索引

使用inner join時隨便向乙個表新增索引即可

這樣新增的原因主要是因為:

驅動表的概念,mysql中指定了連線條件時,滿足查詢條件的記錄行數少的表為驅動表;如未指定查詢條件,則掃瞄行數少的為驅動表。mysql優化器就是這麼粗暴以小表驅動大表的方式來決定執行順序的。

MySQL索引優化案例

開發同學或多或少會遇到系統響應慢的問題,除了業務系統本身的問題外,常常會遇到sql查詢慢的問題,這篇文章結合實際案例分析mysql innodb儲存引擎的索引優化,這篇文章不會介紹b 樹的知識點,如果需要了解聚集索引和輔助索引特點的同學可以參考這篇文章,這篇文章主要會介紹三星索引和icp優化.首先是...

MySql索引優化案例

建立新錶 create table article id int unsigned not null primary key auto increment,author id int unsigned not null,category id int unsigned not null,views ...

MySQL索引優化(索引三表優化案例)

建表sql phone book表建立索引 1 保證被驅動表的join欄位已經被索引 被驅動表 join 後的表為被驅動表 需要被查詢 2 left join 時,選擇小表作為驅動表,大表作為被驅動表。但是 left join 時一定是左邊是驅動表,右邊是被驅動表 3 inner join 時,my...