我們都知道在 mysql 中使用索引可以提高查詢效率,但有時候真正執行sql查詢的時候卻沒有按照我們的預想使用索引,而是全表掃瞄,導致有慢sql影響了整個**的效率,甚至導致**崩潰,所以我們需要了解mysql是如何選擇使用索引的,以便建立合適的索引 (本文基於mysql5.7,innodb引擎)假設有一張使用者表
create table `test_user` (
`user_id` int(11) not null auto_increment,
`name` varchar(20) not null default '',
`birthday` date not null,
`***` tinyint(1) default null,
`height` int(11) not null,
`weight` int(11) not null,
primary key (`user_id`),
key `idx_name_height_weight` (`name`,`height`,`weight`),
key `idx_height` (`height`)
) engine=innodb default charset=utf8;
我們建立了name,height,weight 的聯合索引,插入測試資料
insert into `test_user` (`user_id`, `name`, `birthday`, `***`, `height`, `weight`)
values
(1, 'tony', '1991-01-01', 1, 176, 65),
(2, 'mary', '1989-12-19', 2, 160, 50),
(3, 'tom', '1996-05-29', 1, 180, 70),
(4, 'kiven', '1994-08-09', 1, 190, 80),
(5, 'john', '1992-11-12', 1, 182, 75);
select * from test_user where name='mary'
檢視執行計畫
可見使用了idx_name_height_weight索引
delete from test_user where name='mary';
檢視執行計畫
這個和之前的執行計畫不太一樣,select tables optimized away(選擇要優化的表)實際就是優化到不能再優化的意思,在這種情況下,mysql把每個key的min() 和 max()值替換成乙個常量,如果查到了這個常量就立即返回,然後看下面的例子,分別在索引列上和非索引列上使用min()函式的執行計畫:
注意select的字段能匹配索引列,比如:
將會出現using filesort,using filesort 是mysql裡一種速度比較慢的外部排序,應當盡量避免
本文講述了mysql什麼時候會使用索引,下章說明什麼時候mysql不能使用索引,點此檢視
MySQL如何使用索引
概念 索引用於快速查詢具有特定列值的行。沒有索引,mysql必須從第一行開始,然後通讀整個表以找到相關的行。表越大,耗費時間越多。如果表中有相關列的索引,mysql可以快速確定要在資料檔案中間查詢的位置,而不必檢視所有資料。這比順序讀取每一行要快得多。大多數mysql索引 primary key,u...
MySql如何使用索引(二)
上篇介紹了mysql什麼時候會嘗試使用索引,本文介紹一下我了解的不會使用索引的情況,仍然使用上次建立好的表 不會使用索引 會使用索引 例如 name欄位為varchar型別的 select from test user where name 1將不能使用索引,而 select from test u...
mysql索引使用 一
來公司幾個月了,成長很快。無論是業務還是技術,自己能感覺到熟悉的很快,也聽到了領導的誇獎。謝謝啊!工作10年了,感謝這10年奠定的基礎。能讓我很快的熟悉專案,很快的協助同事完成任務。最近幾年也做過專案管理的一些事,所以我也敢說敢問。勇敢的跟同事去要任務,因為其他服務端開發的同事都是兼職,所以我必須感...