MySql如何使用索引 一

2021-09-12 07:50:16 字數 2407 閱讀 9478

我們都知道在 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年奠定的基礎。能讓我很快的熟悉專案,很快的協助同事完成任務。最近幾年也做過專案管理的一些事,所以我也敢說敢問。勇敢的跟同事去要任務,因為其他服務端開發的同事都是兼職,所以我必須感...