6、mysql索引
mysql
注意:建立索引的基本原則:
web
一、索引要建在使用較多的字段上
sql
二、儘可能不要在相同值較多的字段上創建索引,好比姓名
數據庫
三、對於常常進行數據存取的字段不要創建索引
函數
四、對於有外鍵引用的表,在主鍵和外鍵上創建索引
mysql索引
索引類型:spa
一、普通索引 regexp
mysql> create index ipaddr_idx(索引名) on accesslog(ipaddr); \\添加索引 (accesslog表 在test數據庫中)
blog
mysql> alter table accesslog add index ipaddr_idx (ipaddr); \\添加索引
索引
mysql> create table student(id int primary key,name varchar(30),sex enum('man','woman'),score float(4,1)
,addr varchar(60),index addr_idx (addr)); \\添加索引
mysql> drop index ipaddr_idx on accesslog; \\刪除索引
練習:從weblog表中查找ip地址爲192.168.20.171的全部行,觀察建立索引前和建立索引後的區別
mysql> select * from accesslog where ipaddr='192.168.20.171';
mysql> create index ipaddr_idx on accesslog(ipaddr);
mysql> select * from accesslog where ipaddr='192.168.20.171';
由此可知,創建索引後 , 提升了查詢速度
練習:觀察下列查詢在沒有創建索引前所使用的時間和索引後所使用的時間,創建索引後下列哪些查詢沒有使用索引。
(1)在employees表中查詢first_name以Mary開頭的全部員工
(2)在employees表中查詢first_name包含mar字符的員工
(3)在employees表中查詢last_name以He開頭的員工
(4)在employees表中查詢last_name包含oo字符的員工
(1)mysql> select * from employees where first_name regexp '^Mary';
> select * from employees where first_name like 'Mary%'; 使用了索引。
mysql> create index flname_idx on employees (first_name,last_name);
mysql> explain select * from employees where first_name like 'Mary%'\G; 查看是否使用了索引。
(2)mysql> select * from employees where first_name regexp 'mar';
select * from employees where first_name like '%Mary%'; 沒有使用索引。
(3)mysql> select * from employees where last_name regexp '^He'; 沒有
(4)mysql> select * from employees where last_name regexp 'oo'; 沒有
mysql> select * from employees where match(first_name,last_name) against('Mary');
二、惟一索引 (字段值必須惟一,但容許有空值)
mysql> create unique index id_idx on weblog(id);
三、全文索引(用於在char,varchar,text等文本類型的字段中)
mysql> create fulltext index flname_idx on employees(first_name,last_name);
四、彙集索引
對於innodb存儲引擎
若是表裏麪包含有主鍵,直接使用主鍵作彙集索引
若是沒有主鍵,則將第一個包含not null屬性的unique index列做爲彙集索引
若是前兩個條件都不知足,則mysql會自動增長一個autoincrement的列做爲彙集索引
五、空間索引
索引使用總結:
(1)索引通常在<,>,<=,>=,between,in以及某些狀況下的like等操做符上才能使用
(2)若是使用like,則%或_不能位於開頭
(3)若是使用多列索引,則第一列必須包含匹配的條件
(4)若是在列上使用函數則不能使用索引
索引的缺點:
建立索引會佔用磁盤空間,尤爲是表很大且建立索引的字段值比較多且內容比較長的話更是如此
對於寫入操做,如insert、update、delete等操做,索引會下降它們的速度