索引就像是一本書的目錄
索引用於快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多,若是表中查詢的列有一個索引,MySQL可以快速到達一個位置去搜索數據文件,而沒必要查看全部數據,那麼將會節省很大一部分時間。函數
不是越多越好
,須要視狀況而定頻繁更新
的表應儘可能少
的索引頻繁用於查詢
的字段進行構建
索引數據量小
的字段儘可能不要
使用索引,查詢全部數據花費的時間比遍歷索引的數據要短,索引將沒有優化效果不一樣值少
的字段儘可能不要
使用索引,如性別字段僅有男女兩個不一樣值。注意:索引是在存儲引擎中實現的,也就是說不一樣的存儲引擎,會使用不一樣的索引
一個索引只包含單個列,但一個表中能夠有多個單列索引
MySQL中基本索引類型,沒有什麼限制,容許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。優化
索引列中的值必須是惟一的,可是容許爲空值code
是一種特殊的惟一索引,不容許有空值索引
在表中的多個字段組合上建立的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最佳左前綴法則字符串
全文索引,只有在MyISAM
引擎上才能使用,只能在CHAR
,VARCHAR
,TEXT
類型字段上使用全文索引。全文索引,就是在一堆文字中,經過其中的某個關鍵字等,就能找到該字段所屬的記錄行,好比有"你是個大煞筆,二貨 ..." 經過大煞筆,可能就能夠找到該條記錄test
空間索引是對空間數據類型的字段創建的索引,MySQL中的空間數據類型有四種,GEOMETRY
、POINT
、LINESTRING
、POLYGON
。在建立空間索引時,使用SPATIAL
關鍵字。要求,引擎爲MyISAM
,建立空間索引的列,必須將其聲明爲NOT NULL
select
使用原則:若是值的差別性大,而且以等值查找(=、 <=>、in)爲主,Hash索引是更高效的選擇,它有O(1)的查找複雜度;若是值的差別性相對較差,而且以範圍查找爲主,B樹是更好的選擇,它支持範圍查找。
B樹索引具備範圍查找和前綴查找的能力,對於有N節點的B樹,檢索一條記錄的複雜度爲O(LogN)。至關於二分查找。搜索
哈希索引只能作等於查找,可是不管多大的Hash表,查找複雜度都是O(1)。遍歷
CREATE TABLE 表名[字段名 數據類型] [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|KEY] [索引名字] (字段名[length]) [ASC|DESC]
示例:數據類型
CREATE TABLE `NewTable` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR (255) NOT NULL, `name` VARCHAR (255) NOT NULL, `sex` TINYINT NOT NULL DEFAULT 0, `address` VARCHAR (255) NULL, PRIMARY KEY (`id`), # 主鍵索引 INDEX `name` (`name`) USING BTREE, # 普通索引 UNIQUE INDEX `username` (`username`) USING BTREE # 惟一索引 INDEX `u_n_a` (`username`, `name`,`address`) USING BTREE # 組合索引 );
ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]
示例:
ALTER TABLE `test` ADD PRIMARY KEY (`id`), # 主鍵索引 ADD INDEX `name` (`name`) USING BTREE , # 普通索引 ADD UNIQUE INDEX `username` (`username`) USING BTREE , # 惟一索引 ADD INDEX `u_n_a` (`username`, `name`, `address`) USING BTREE ; # 組合索引
ALTER TABLE 表名 DROP INDEX 索引名。
示例:
ALTER TABLE `test` DROP PRIMARY KEY, DROP INDEX `username`, DROP INDEX `name`, DROP INDEX `u_n_a`;
先刪後建
ALTER TABLE `test` DROP INDEX `username` , ADD UNIQUE INDEX `username1` (`username`) USING BTREE , DROP INDEX `name` , ADD INDEX `name2` (`name`) USING BTREE , DROP INDEX `u_n_a` , ADD INDEX `u_a_n` (`username`, `address`, `name`) USING BTREE ;
like '%test
# 索引生效 select * from `test` where `name` like "123"; # 索引生效 select * from `test` where `name` like "123%"; # 索引失效 select * from `test` where `name` like "%123"; # 索引失效 select * from `test` where `name` like "%123%";
如 sex
字段上添加索引
# 索引失效 select * from `test` where `sex`*0.5 = 1
>
,<
,between and
)後,沒法命中組合索引右邊的列構建索引
ALTER TABLE `test` ADD INDEX `s_n` (`sex`, `name`) USING BTREE ;
示例:
# 命中所有 select * from `test` where `sex` = 1 and `name` = 'a'; # 命中部分,sex命中,name失效 select * from `test` where `sex` > 1 and `name` = 'a';
!=
, is null
, is not null
沒法使用索引構建索引
ALTER TABLE `test` ADD INDEX `name` (`name`) USING BTREE ;
示例
# 索引失效 select * from `test` where `name` = 123; # 索引生效 select * from `test` where `name` = '123';
or
條件致使索引失效構建索引
ALTER TABLE `test` ADD INDEX `sex` (`sex`) USING BTREE ; ADD INDEX `n_u` (`name`, `username`) USING BTREE ;
示例:
# 索引不生效 select * from `test` where (`name` = 'aa' and `username` = 'aa') or `sex` > 1 # 索引sex生效 select * from `test` where `sex` = 1 and (`id` = 2 or `name` = 'aa' )
若是索引了多列,要遵照最左前綴法則。指的是查詢要從索引的最左前列開始而且不跳過索引中的列
以下構建索引
ALTER TABLE `test` ADD INDEX `u_a_n` (`username`, `address`, `name`) USING BTREE ;
以下查詢狀況
# 命中部分 select * from `test` where `username` = 'aaa'; # 命中部分 select * from `test` where `username` = 'aa' and `address` = 'aaa'; # 全命中 select * from `test` where `username` = 'aa' and `address` = 'aaa' and `name` = 'a'; # 不命中,第一條件字段不是username select * from `test` where `address` = 'aaa';