索引在資料庫中類似圖書館的目錄,合理使用能加快資料庫的查詢速度。索引在一般使用中,分為單列索引,聯合索引(復合索引)例如,目前存在一張表,結構如下:
create table `my_audience_push_test` (
`id` int(11) not null auto_increment,
`main_audience_id` varchar(100) not null comment '主包id',
`main_account_id` varchar(50) not null,
`account_id` bigint(20) not null comment '推送賬號',
`audience_id` bigint(20) not null comment '複製關係的子人群包id',
`media_type` tinyint(4) not null default '1',
`type` tinyint(4) not null comment '0.推送關係 1.複製關係',
primary key (`id`)
) engine=innodb auto_increment=37512 default charset=utf8 comment='人群包推送投放記錄'
檢視|刪除索引:
show index from `my_audience_push_test`
drop index u_index on `my_audience_push_test`
1.primary : 主鍵索引,唯一且不能為空,一張表中只能有乙個主鍵索引(通常在建表的時候就指定);
2.normal(non-unique)普通索引,索引列沒有任何限制:
create index `idx_main_audience_id` on `db_my`.`my_audience_push_test` (main_audience_id) comment '普通索引' algorithm default lock default
alter table `my_audience_push_test` add index `idx_main_audience_id`(main_audience_id)
3.unique:唯一索引,索引列的值必須是唯一的,但允許有空。
alter table `my_audience_push_test` add unique `idx_audience_id`(audience_id)
4.fulltext:全文搜尋的索引,字段型別為文字型別。用於搜尋很長一篇文章的時候,效果最好。如果文字內容較短,用普通的index也可以。
1.復合索引同樣具備normal、unique、fulltext等型別
alter table `my_audience_push_test2` add index `main_audience_id_account_id`(main_audience_id,main_account_id) comment '復合索引'
2.復合索引的最左原則,當建立乙個復合索引a,b,c時,基於以下where條件:
select * from table where a=x and b=y and c=z
select * from table where a=x and b=y
select * from table where b=y and a=x
select * from table where a=x and c=z
select * from table where c=z and a=x
才起到索引優化查詢的作用,原因復合索引在儲存結構上,是先儲存a再儲存b,c的索引,反之以下語句是不起作用的:
select * from table where b=y
select * from table where c=z
select * from table where b=y and c=z
如果希望條件c=z 或者 b=y起作用,就必須指定a的值才行。
1.索引雖然提高了查詢速度,但是降低了insert、update、delete的速度,因為這些操作都伴隨著對引用的增刪改操作;
2.建立索引時會占用一定的硬碟空間;
1.對於單索引的字段,null值將不會被包含在索引中;組合索引只有有一列含有null值,那麼這一列對於組合索引就是無效的,所以在設計資料庫的時候盡量避免字段預設值為null;
2.盡量使用短索引(索引一般最大長度不能超過1000位元組):
一般建立索引時,可以指定索引長度,例如某字段為varchar(100)的列,但真實儲存的資料只有20位的話,在建立索引時應指定索引的長度為20,如下:
alter table `my_audience_push_test` add index u_index(main_audience_id(20))
3.索引排序:
mysql在查詢的時候只會使用乙個索引,因此如果where子句已經使用了索引的話,那麼order by中的列是不會使用索引的,所以order by盡量不要包含多個列的排序,如果非要多列排序,最好使用組合索引。
4.like語句使用:
一般不建議使用like語句,如果一定要使用,注意採用like 'aaa%' 而不是 like '%aaa%' ,後者是不會使用到索引的。
5.不要使用not in 和 <> 操作
1.hash,用於對等比較,如「=」和「<=>」;
2.btree,採用樹結構儲存索引,通常在類似「 = ,> , < , >= , <= , between,like 」等操作查詢效率較高,也是mysql預設的儲存結構方法;
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...