Mysql索引優化

2021-10-14 10:09:07 字數 3332 閱讀 7153

索引用於快速查詢具有特定列值的行。沒有索引,mysql必須從第一行開始,然後再通讀整個表以找到相關的行。表越大,花費時間越多。

如果表中有相關​​列的索引,mysql可以快速確定要在資料檔案中間查詢的位置,而不必檢視所有資料。這比順序讀取每一行要快得多。

表的主鍵表示您在最重要的查詢中使用的一列或一組列。它具有關聯的索引,可提高查詢效能。查詢效能可從not null優化中受益,因為它不能包含任何null值。

如果您的表又大又重要,但沒有明顯的列或一組列用作主鍵,則可以建立乙個單獨的列,並使用自動增量值作為主鍵。當您使用外來鍵聯接表時,這些唯一的id可用作指向其他表中相應行的指標。

如果乙個表有很多列,並且您查詢了許多不同的列組合,將不常用的資料拆分為單獨的表(每個表包含幾列),然後通過複製數字id將它們關聯回主表可能會比較有效。

這樣,每個小表都可以具有乙個主鍵來快速查詢其資料,並且您可以使用聯接操作僅查詢所需的一組列。根據相關資料的分布方式,查詢可能執行較少的i / o並占用較少的快取,因為相關的列在磁碟上打包在一起。為使效能最大化,查詢嘗試從磁碟讀取盡可能少的資料塊;

索引的最常見型別涉及單個列,該列將來自該列的值的副本儲存在資料結構中,從而允許快速查詢具有相應列值的行。b樹資料結構可以讓索引快速查詢特定值,一組值,或值的範圍,對應於運營商,如where子語句 =, >,≤, between,in,等等。

每個儲存引擎定義每個表的最大索引數和最大索引長度。所有儲存引擎每個表至少支援16個索引,並且索引總長度至少為256個位元組。大多數儲存引擎都有更高的限制。

使用 字串列的索引規範中的語法,您可以建立僅使用列首字元的索引 。以這種方式僅索引列值的字首可以使索引檔案小得多。為a或 column編制索引時 , 必須為索引指定字首長度。例如: col_name(n)nblobtext

create

table test (blob_col blob

,index

(blob_col(10)

));

對於innodb使用redundant 或 compact 行格式的表, 字首的最大長度為767個位元組 。對於innodb使用dynamic 或 compressed 行格式的表, 字首長度限制為3072位元組 。對於myisam表,字首長度限制為1000個位元組。

注意:字首限制以位元組為單位,而在字首長度create table, alter table和 create index語句被解釋為非二進位制串型別的字元數(char, varchar, text對於二進位制串型別),並且位元組數(binary, varbinary, blob)。為使用多位元組字符集的非二進位制字串列指定字首長度時,請考慮到這一點。

mysql可以建立復合索引(即,多列上的索引)。乙個索引最多可以包含16列。對於某些資料型別,可以為列的字首建立索引。

mysql可以將多列索引用於測試索引中所有列的查詢,或者僅測試第一列,前兩列,前三列等等的查詢。如果在索引定義中以正確的順序指定列,則單個復合索引可以加快對同一表的幾種查詢。

多列索引可以被認為是排序陣列,其行包含通過串聯索引列的值而建立的值。

假設乙個表具有以下規範:

create

table c(

id int

notnull

auto_increment

, last_name char(30

)not

null

, first_name char(30

)not

null

,primary

key(id)

,index name(last_name,first_name));

insert

into c(last_name,first_name)

values

('張'

,'三');

insert

into c(id,last_name,first_name)

values

(null

,'張'

,'亮'

);

該name指數是在乙個索引 last_name和first_name 列。該索引可用於查詢中的查詢,這些查詢指定在已知範圍內的last_name和first_name 值組合的值。它也可以用於僅指定last_name值的查詢, 因為該列是索引的最左字首。

因此,該name索引用於以下查詢中的查詢:

select

*from c where last_name=

'張';

select

*from c where last_name=

'張'and first_name=

'三';

select

*from c where last_name=

'張'and

(first_name=

'三'or first_name=

'亮')

;

但是,在以下查詢中,name索引 不用於查詢:

select

*from c where last_name=

'張';

select

*from c where last_name=

'張'or first_name=

'亮';

假設您發出以下 select語句:

select

*from tbl_name

where col1=val1 and col2=val2;

如果col1和上 存在多列索引col2,則可以直接獲取相應的行。如果col1和上存在單獨的單列索引 col2,那麼優化器將嘗試使用索引合併優化(請參見 第8.2.1.3節「索引合併優化」),或者嘗試通過確定哪個索引排除更多行並使用來查詢限制性最強的索引。該索引以獲取行。

如果列不構成索引的最左字首,則mysql無法使用索引執行查詢。假設您具有以下select所示的語句:

select

*from tbl_name where col1=val1;

select

*from tbl_name where col1=val1 and col2=val2;

select

*from tbl_name where col2=val2;

select

*from tbl_name where col2=val2 and col3=val3;

如果存在乙個索引(col1, col2, col3),則僅前兩個查詢使用該索引。第三個查詢和第四個查詢確實涉及索引列,但是不使用索引來執行查詢,因為(col2)和 (col2, col3)不是的最左字首 (col1, col2, col3)。

mysql 優化 聚集索引 mysql 索引優化

一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...

mysql索引優化原則 MySQL 索引優化原則

索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...

mysql索引優化原則 MySQL索引優化

mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...