MYSQL優化 索引(一)

2021-08-03 05:18:41 字數 4279 閱讀 8015

對於mysql的優化的各種方式中,索引方式佔很大比例。當資料很大時,才會感受到索引的魅力。為了方便學習和工作中使用,收集實驗整理下的。

我們知道,查詢資料時,先把資料從磁碟塊中讀取到記憶體中,再做處理的。如果沒有索引時,就會容易全表查詢。而io操作又是最耗時的。

比如:1~100放入磁碟快1中,101~200放入磁碟塊2中,201~300放在磁碟塊3中。如果在沒有索引的狀態下找299時,就會從頭開始,把塊1放入記憶體中;查詢沒有,再把塊2的放入記憶體;查詢沒有,放入塊3的,這時候才找到資料。其中的io開銷,會隨著資料的越大而越大。

如果有索引時,就直接從塊3中讀取放入記憶體。節省了很多耗時。

檢視命令為:

show keys from table_name;

或 show index from table_name;

比如表結構如下:

create

table

`jz_remodeling_product_config` (

`id`

int(11) not

null,

`product_id`

int(11) default

'0' comment '商品id',

`type_id`

int(11) default

'0' comment '型別id(配置表型別,如改造空間等)',

`obj_id`

int(11) default

'0' comment '資料字典表id',

`create_date`

timestamp

null

default

current_timestamp,

`is_del`

int(11) default

'0',

primary

key (`id`),

unique

key`uniq_product_type_obj` (`product_id`,`type_id`,`obj_id`),

key`idx_product_id` (`product_id`)

) engine=innodb default charset=utf8 comment='商品配置表';

執行結果:

建立索引 :

alter

table tbl_name add

primary

key (column_list): 該語句新增乙個主鍵,這意味著索引值必須是唯一的,且不能為null。

alter

table tbl_name add

unique index_name (column_list]): 這條語句建立索引的值必須是唯一的(除了null外,null可能會出現多次)。

alter

table tbl_name add index index_name (column_list): 新增普通索引,索引值可出現多次。

alter

table tbl_name add fulltext index_name (column_list):該語句指定了索引為 fulltext ,用於全文索引。

主鍵只能作用於乙個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(not null)。fulltext全文索引,innodb不支援,myisam支援效能比較好,一般在 char、varchar 或 text 列上建立。刪除索引:

1、  drop index 索引名 on 表名; 

2、 alter

table 表名 drop index 索引名;

3、 alter

table 表名 drop

primary

key;

命名方式(建議方式):

約定注意點:

以下表為參考:

create

table

`jz_remodeling_product_config` (

`id`

int(11) not

null,

`product_id`

int(11) default

'0' comment '商品id',

`type_id`

int(11) default

'0' comment '型別id(配置表型別,如改造空間等)',

`obj_id`

varchar(11) default

'0' comment '資料字典表id',

`create_date`

timestamp

null

default

current_timestamp,

`is_del`

int(11) default

'0',

`user_name`

varchar(11) default

null,

primary

key (`id`),

unique

key`uniq_product_type_obj` (`product_id`,`type_id`,`obj_id`),

key`idx_user_name` (`user_name`)

) engine=innodb default charset=utf8 comment='商品配置表';

(1)組合索引為(product_id,type_id,obj_id)。根據原則,where中要有product_id的條件才會用到索引。

(注意:=和in可以亂序。mysql的查詢優化器會幫你優化成索引可以識別的形式)

以下可以用到索引:

where product_id = 3

and type_id = 110

and obj_id = 1;

where product_id = 3

and type_id = 110;

where product_id = 3

and obj_id = 1;

where product_id = 3;

where type_id = 110

and product_id = 3;

where product_id in (3, 4);

where type_id in (110, 120) and product_id in (3, 4);

而這些就用不到索引:

where type_id in (110, 120);

where type_id = 110 -- and obj_id = 1;

如果where中有個全域性的or,哪怕or後的有索引。既然還是使用不到索引。

where product_id = 3

and obj_id = 1

or user_name = 10;

如果是區域性的or。還是有可能的:

where product_id = 3

and (obj_id = 1

or user_name = 10)

(2)對於單列索引,依然有這個原則。對於(user_name):

where user_name like

'2%'; 就可以使用到索引;

where user_name like

'%2%'; 這種就不行了。

where product_id + 1 = 3; 就使用不上索引。不過我們可以轉換方式為:

where product_id = 3 - 1; 這種方式就可以用上。

索引的問題:

索引並不是越多越好,也是有維護成本的。

- 索引檔案也需要占用一定的空間,會增加額外空間消耗。

- 索引的建立和維護,資料越多,耗時越多。

- 對錶資料進行 更新、插入、刪除操作時,對應的索引也需要進行變動更新。因此需要額外的時間消耗。

索引主要用於查詢操作時,更快的找到資料。所以索引的是否建立以及索引的型別,需要平衡考慮表的查詢與更新的比例,以及查詢的方式。

MySQL索引優化 一

案例 1 首先建立乙個article表 往其中插入三條資料 2 查詢category id為1且comments大於1的情況下,views最多的article id select id,author id from article where category id 1and comments 1o...

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