1. 程式人生 > >SQL優化(五)索引長度

SQL優化(五)索引長度

    在SQL執行計劃中,key_len 表示索引長度,經常用於判斷複合索引是否被完全使用。先說結論:

  1. 在utf8編碼方式下,一個字元佔3個位元組。
  2. 如果索引欄位可以為null,MySQL會使用1個位元組標識。
  3. 如果索引欄位的型別長度可變,MySQL會使用2個位元組標識。

    下面詳細分析SQL執行計劃中的索引長度。

1.建表、建索引、插入資料

    建立一個person表,僅有非空name列。在name上建立索引,並插入三條資料。相應的SQL語句如下:

create table person(name char(20) not null);

alter table person add index idx_name(name);
insert into person values("sql");
insert into person values("java");
insert into person values("html");

2.SQL執行計劃

2.1 索引非空

    在建表時,我們設定name為非空列,現在分析下面一條查詢語句的執行計劃。

explain select * from person where name ='sql';

   SQL語句的執行計劃如下:

    key_len = 60,索引段name的長度是20個字元,key_len = 20*3 = 60。

    這驗證了第1條結論:在utf8編碼方式下,一個字元佔3個位元組。

2.2索引可空

   現在我們稍作改動,允許name列為空。執行同樣的查詢語句,看看執行計劃會有什麼變化?

alter table person modify name char(20) null;

   SQL語句的執行計劃如下:

   key_len = 61,索引段name的長度是20個字元,key_len = 20*3 + 1= 61。

這驗證了第2條結論:如果索引欄位可以為null,MySQL會使用1個位元組標識。

2.3索引可變長度型別

繼續改動,將name列的型別改為可變長度型別varchar(20),執行上述同樣的查詢語句,看看執行計劃會有什麼變化?

alter table person modify name varchar(20) ;

   SQL語句的執行計劃如下:

   key_len = 63,索引段name的長度是20個字元,key_len = 20*3 + 1 + 2= 63。

這驗證了第3條結論:如果索引欄位的型別長度可變,MySQL會使用2個位元組標識。