建表
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...