索引認識
索引:1、是乙個排序的列表
2、列表中儲存索引的值和這個值得資料所在行的實體地址
3、在資料量比較龐大(超過1萬條)的時候,索引可以加快查詢的速度
4、因為使用索引後不用掃瞄全表來定位某行的資料、而是先通過索引表找到該行的資料對應的實體地址然後訪問相應的資料
mysql中建立索引
1、建立表的時候直接新增索引
create table mytable(
id int not null,
username varchar(16) not null,
index [indexname] (username(length))
);2、建立表之後新增索引
alter table my_table add [unique] index index_name(column_name);
或者create index index_name on my_table(column_name);
建立索引需要注意的地方
1、索引需要占用磁碟空間、因此在建立時需要考慮磁碟空間是否足夠
2、建立索引時需要對錶加鎖、所以在進行建立索引需在表空閒期
使用索引查詢
具體查詢:
select * from table_name where column_1=column_2;(column_1建立了索引)
或者模糊查詢
select * from table_name where column_1 like '%三'
select * from table_name where column_1 like '三%'
select * from table_name where column_1 like '%三%'
select * from table_name where column_1 like '_好_'
如果要表示在字串中既有a又有b,那麼查詢語句為:
select * from table_name where column_1 like '%a%' and column_1 like '%b%';
select * from table_name where column_1 like '[張李王]三'; //表示column_1中有匹配張
三、李三、王三的都可以
select * from table_name where column_1 like '[^張李王]三'; //表示column_1中有匹配除了張
三、李三、王三的其他三都可以
//在模糊查詢中,%表示任意0個或多個字元;_表示任意單個字元(有且僅有),通常用來限制字串長度;表示其中的某乙個字元;[^]表示除了其中的字元的所有字元
或者在全文索引中模糊查詢
select * from table_name where match(content) against('word1','word2',...);
刪除索引
drop index my_index on tablename;
或者alter table table_name drop index index_name;
檢視表中索引
show index from tablename
檢視查詢語句使用索引的情況
//explain 加查詢語句
explain select * from table_name where column_1='123';
索引的優缺點
優勢:可以快速檢索、減少i/o次數、加快檢索速度、
根據索引分組和排序可以加快分組和排序
劣勢:索引本身就是一張表、需要儲存空間,
索引表的建立和維護都需要時間成本,
構建索引會降低資料表的修改操作(增刪改)效率,因為在修改資料表的同時還需要修改索引表
索引分類
常見的索引:主鍵索引、唯一索引、普通索引、全文索引、組合索引
1、主鍵索引:即主索引,根據主鍵pk_clolum(length)建立索引,不允許重複,不允許空值;
alter table 'table_name' add primary key pk_index('col');
2、唯一索引:用來建立索引的列的值必須是唯一的,允許空值
alter table 'table_name' add unique index_name('col');
3、普通索引:用表中的普通列構建的索引,沒有任何限制
alter table 'table_name' add index index_name('col');
4、全文索引:用大文字物件的列構建的索引
alter table 'table_name' add fulltext index ft_index('col');
5、組合索引:用多個列組合構建的索引,這多個列中的值不允許有空值
alter table 'table_name' add index index_name('col1','col2','col3');
遵循「最左字首」原則,把最常用作為檢索或排序的列放在最左,依次遞減,組合索引相當於建立了col1,col1col2,col1col2col3三個索引,而col2或者col3是不能使用索引的。
在使用組合索引的時候可能因為列名長度過長而導致索引的key太大,導致效率降低,在允許的情況下,可以只取col1和col2的前幾個字元作為索引
索引實現原理
mysql支援諸多儲存引擎,而各種儲存引擎對索引的支援也各不相同,因此mysql資料庫支援多種索引型別,如btree索引、b+tree索引、雜湊索引、全文索引
此外myisam和innodb的區別總結如下:
myisam innodb
索引型別 非聚簇 聚簇
支援事務 是 否
支援表鎖 是 是
支援行鎖 否 是(預設)
支援外來鍵 否 是
支援全文索引 是 是(5.6以後支援)
適用操作型別 大量select下使用 大量insert、delete和update下使用
myisam和innodb引擎對比
總結如下:
• innodb 支援事務,支援行級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;
• myisam 不支援事務,支援表級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;
此外,memory 不支援事務,支援表級別鎖定,支援 b-tree、hash 等索引,不支援 full-text 索引
索引使用策略
什麼時候需要使用索引
1、主鍵自動建立唯一索引
2、經常作為查詢條件的列
3、作為排序的列
4、查詢中與其他表關聯的字段,外來鍵關係建立索引
5、高併發條件下傾向組合索引
6、用於聚合函式的列可以建立索引,例:使用了max(column_1)或者count(column_1)中column_1就需要建立索引
什麼時候不能使用索引
1、經常增刪改
2、有大量重複值的列
3、表資料量低於1000
索引失效:
1、組合索引某一列有null值,那麼這一列對組合索引就是無效
2、在select中,索引只能使用一次,where使用後、order by再使用就失效
3、like中"%aaa%"索引無效,但"aaa%"索引是有效的
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...