1. 程式人生 > >mysql的幾種索引

mysql的幾種索引

where子句 表名 列表 分享圖片 類型 ali 什麽 erl 唯一索引

為什麽創建索引後,速度就會變快?

技術分享圖片

答:使用索引後,查詢是按二叉樹算法來查找到記錄

索引使用的註意事項:

索引的代價:

1. 占用磁盤空間

2. 對dml(新增、修改、刪除)操作有影響,變慢

哪些列適合添加索引:

1. 較頻繁的作為查詢條件字段應該創建索引
select * from emp where empno = 1
2. 唯一性太差的字段不適合單獨創建索引,即使頻繁作為查詢條件
select * from emp where sex = ‘男‘
3. 更新非常頻繁的字段不適合創建索引
select * from emp where logincount = 1
4. 不會出現在WHERE子句中字段不該創建

總結: 滿足以下條件的字段,才應該創建索引.

a: 肯定在where條經常使用

b: 該字段的內容不是唯一的幾個值(sex)

c: 字段內容不是頻繁變化.

使用索引的註意事項

把dept表中,我增加幾個部門:

alter table dept add index my_ind (dname,loc); // dname 左邊的列,loc就是右邊的列

說明,如果我們的表中有復合索引(索引作用在多列上), 此時我們註意:

1, 對於創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。

explain select * from dept where loc=‘aaa‘\G

就不會使用到索引

2,對於使用like的查詢,查詢如果是 ‘%aaa’ 不會使用到索引

‘aaa%’ 會使用到索引。

比如: explain select * from dept where dname like ‘%aaa‘\G

不能使用索引,即,在like查詢時,關鍵的 ‘關鍵字’ , 最前面,不能使用 % 或者 _這樣的字符., 如果一定要前面有變化的值,則考慮使用 全文索引->sphinx.

1. 如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有字段,都必須建立索引, 我們建議大家盡量避免使用or 關鍵字

select * from dept where dname=’xxx’ or loc=’xx’ or deptno=45

2. 如果列類型是字符串,那一定要在條件中將數據使用引號引用起來。否則不使用索引。(添加時,字符串必須’’), 也就是,如果列是字符串類型,就一定要用 ‘’ 把他包括起來.

3. 如果mysql估計使用全表掃描要比使用索引快,則不使用索引

explain 可以幫助我們在不真正執行某個sql語句時,就執行mysql怎樣執行,這樣利用我們去分析sql指令.

技術分享圖片

如何查看索引使用的情況:

show status like ‘Handler_read%’;

大家可以註意:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。

handler_read_rnd_next:這個值越高,說明查詢低效。

sql語句的小技巧

1. 在使用group by 分組查詢是,默認分組後,還會排序,可能會降低速度.

比如:

技術分享圖片

在group by 後面增加 order by null 就可以防止排序.

1. 有些情況下,可以使用連接來替代子查詢。因為使用join,MySQL不需要在內存中創建臨時表。

select * from dept, emp where dept.deptno=emp.deptno; [簡單處理方式]

select * from dept left join emp on dept.deptno=emp.deptno; [左外連接,更ok!]

======================================================================

創建索引有四種方式分別是:主鍵索引、唯一索引、全文索引、普通索引

1、主鍵索引

當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引

create table aaa

(id int unsigned primary key auto_increment ,

name varchar(32) not null defaul ‘’);

這是id 列就是主鍵索引.

如果你創建表時,沒有指定主鍵索引,也可以在創建表後,在添加, 指令:

alter table 表名 add primary key (列名);

舉例:

create table bbb (id int , name varchar(32) not null default ‘’);

alter table bbb add primary key (id);

2、普通索引

一般來說,普通索引的創建,是先創建表,然後在創建普通索引

比如:

create table ccc(

id int unsigned,

name varchar(32)

)

create index 索引名 on 表 (列1,列名2);

3、全文索引

全文索引,主要是針對對文件,文本的檢索, 比如文章, 全文索引針對MyISAM有用.

創建 :

CREATE TABLE articles (

id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR(200),

body TEXT,

FULLTEXT (title,body)

)engine=myisam charset utf8;

添加數據:

INSERT INTO articles (title,body) VALUES

(‘MySQL Tutorial‘,‘DBMS stands for DataBase ...‘),

(‘How To Use MySQL Well‘,‘After you went through a ...‘),

(‘Optimizing MySQL‘,‘In this tutorial we will show ...‘),

(‘1001 MySQL Tricks‘,‘1. Never run mysqld as root. 2. ...‘),

(‘MySQL vs. YourSQL‘,‘In the following database comparison ...‘),

(‘MySQL Security‘,‘When configured properly, MySQL ...‘);

如何使用全文索引:

錯誤用法: select * from articles where body like ‘%mysql%’; 【不會使用到全文索引】

證明: explain select * from articles where body like ‘%mysql%’

正確的用法是: select * from articles where match(title,body) against(‘database’); 【可以】

知識點說明:

1. 在mysql中fulltext 索引只針對 myisam生效

2. mysql自己提供的fulltext針對英文生效->sphinx (coreseek) 技術處理中文

3. 使用方法是 match(字段名..) against(‘關鍵字’)

4. 全文索引一個 叫 停止詞, 因為在一個文本中,創建索引是一個無窮大的數,因此,對一些常用詞和字符,就不會創建,這些詞,稱為停止詞.

4、唯一索引

①當表的某列被指定為unique約束時,這列就是一個唯一索引

create table ddd(id int primary key auto_increment , name varchar(32) unique);

這時, name 列就是一個唯一索引.

unique字段可以為NULL,並可以有多NULL, 但是如果是具體內容,則不能重復.

主鍵字段,不能為NULL,也不能重復.

②在創建表後,再去創建唯一索引

create table eee(id int primary key auto_increment, name varchar(32));

create unique index 索引名 on 表名 (列表..);

查詢索引的方式:

1、desc 表名 【該方法的缺點是: 不能夠顯示索引名.】

2、show index(es) from 表名

3、show keys from 表名

刪除索引的方式:

alter table 表名 drop index 索引名;

如果刪除主鍵索引: alter table 表名 drop primary key

修改索引的方式:

先刪除,再重新創建.

mysql的幾種索引