索引的概述
索引
什么是索引
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表里面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。?
索引的分類
主鍵索引
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。?
創建主鍵索引
主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。?
當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引
create table aaa(id int unsigned primary key auto_increment ,name varchar(32) not null default '');這是id 列就是主鍵索引.
create table bbb (id int , name varchar(32) not null default '');如果你創建表時,沒有指定主鍵索引,也可以在創建表后,在添加, 指令:
實例:
alter table 表名 add primary key (列名);刪除主鍵索引
alter table articles drop primary key;查詢索引
desc? 表名;?? 不能顯示索引名稱show index from 表名show keys from 表名全文索引
創建表結構
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%'; 錯誤用法 索引不會生效錯誤用法:正確用法:
select * from articles where match(title,body) against ( 'database')說明:
唯一索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式創建:?
創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);?
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);?
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );?
?
創建表結構
create table ddd(id int primary key auto_increment , name varchar(32) unique);注意
unique字段可以為NULL,并可以有多NULL, 但是如果是具體內容,則不能重復,
但是不能存有重復的空字符串’’
普通索引
?普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。
create table ccc(id int unsigned,name varchar(32))create index 索引名 on 表 (列1,列名2);
總結
- 上一篇: 数据库-优化-MYSQL执行引擎介绍
- 下一篇: 索引实现原理