MySQL優化--------索引(1)-------增刪改查

索引大致分爲四種:普通索引,唯一索引,主鍵索引,全文索引

本節主要闡述索引的增加,查詢,修改和刪除

第一:添加索引

第一種索引:主鍵索引的添加

當創建一張表,把某個列設置爲主鍵時,這個主鍵就是主鍵索引

比如:

create table aaa(id int unsigned primary key, name varchar(32) not null default '');

 當表創建成功以後再添加主鍵索引也是可以的;比如:alter table 表名 add primary key(列名);

create table bbb(id int , name varchar(32) not null default '');
alter table bbb add primary key(id);

 

 比如:我們在之前創建的emp表中添加主鍵索引

alter table emp add primary key(empno);

我們查詢一條sql,就會非常快 

 

第二種索引:普通索引的添加

一般來說,普通索引是在表創建成功後添加的

create index 索引名 on table(列);

create table ccc(id int , name varchar(32) not null default '');
 create index fjz on ccc(name);

第三種索引:全文索引的添加

全文索引,主要針對的是文本的檢索,比如:文章。但是隻對engine=myisam有效,但是Mysql默認的是myisam

以下兩種都可以

CREATE TABLE articles (
       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       title VARCHAR(200),
       body TEXT,
       FULLTEXT (title,body)
     );

 

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 ...');

查看全文索引:全文索引爲title,所用於title與body

全文索引錯誤的用法:這個是沒有用到索引的。

select * from articles where body like '%database%'

分析一下:

explain select * from articles where body like '%database%'\G

正確的用法是:

SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');

 

分析一下這條sql,到底有沒有用到全文索引。

explain SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database')\G

 

 說明:

1. 全文索引只針對英文字符,對中文是無效的

2. 只對engine=myisam有效,但是Mysql默認的是myisam

3. 方法:match(字段名,字段名) against ('要搜索的字符')

4. 全文索引只針對一些不常用到的字符檢索,對於常用的字符,比如:a/b/c...是不進行檢索的,這些詞稱之爲停止詞

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

第四種索引:唯一索引的添加

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

比如,我們創建一個表(eee)

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

查看索引,會發現有兩個索引,主鍵索引和唯一索引

show index from eee\G

那麼:唯一索引是否可以爲空呢?

實驗一下:向eee表中添加數據爲null

insert into eee values(1,null);

結果顯示unique索引是可以爲null值的。

既然是唯一索引,那麼是否可以同時存在兩個或多個null值呢?

再添加一條數據

insert into eee values(2,null);

結果顯示unique索引是可以同時存在多個null值的

unique索引是否可以存在一個或多個空字符(“”)

再添加幾條數據

insert into eee values(3,'');

結果顯示:是可以存在空字符串的

添加第四條數據

insert into eee values(4,'');

添加不成功,所以說unique索引是不能同時存在兩個以上的 空字符串的

 

總結:

1. unique索引字段可以爲一個或多個null值,但是如果是具體的內容則不能重複,比如只能存在一個空字符串(‘’);

2. 主鍵索引字段不允許爲null,且不能重複

3. 創建表後添加unique索引:create unique index 別名 on table(字段);

create table fff(id int primary key auto_increment, name varchar(32));
create unique index my_unique on fff(name);

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

第二:查詢索引, 有三種方法:

第一種方法:desc 表名

desc aaa

第二種方法:show index(es) from 表名

show index from aaa\G

第三種方法:show keys from 表名

show keys from aaa\G

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

第三:刪除索引

alter table 表名 drop index 索引名

比如:刪除上面創建的fff表中的unique索引

alter table fff drop index my_unique;

只有主鍵索引,而唯一索引已經刪除了; 

刪除主鍵索引,比較特殊

alter table 表名 drop primary key; 【如果這個主鍵是自增的,先取消自增長.】

具體方法如下:

alter table fff modify id int ; 【重新定義列類型】

alter table fff drop primary key;

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

第四:修改索引

策略:先刪除索引,在重新創建新的索引

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

第五:使用索引的代價

1. 會佔據磁盤空間

2. 對於select語句會增加效率,但是對insert/update/delete語句效率會降低

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章