本篇博客講的是MySQL的索引的功能和使用 , 以及存儲引擎的基本簡介
一. mysql索引
索引的簡介和作用
索引在MySQL中叫做"鍵" , 是存儲引擎用於快速找到記錄的一種數據結構 . 索引對良好的性能非常關鍵 , 尤其是當表中的數據量越來越大時 , 索引對於性能的影響愈來愈發重要 .
作用 : 通過一定的算法將數據庫中的記錄按一定的規律進行分組 , 這樣查信息時可以縮小數據的搜索範圍 , 從而提高溜了查詢效率
用生活實例來說 , 索引就好像書的目錄 , 清單上的列表 ; 好比人去吃火鍋 , 當菜單拿到客戶手上 , 客戶可以根據菜單上的分類(海鮮 , 蔬菜類 , 肉類 , 飲料類等) , 根據自己的口味能第一時間找到自己想吃的菜 .
索引的分類
索引可分爲 : 普通索引 , 唯一索引 , 全文索引 , 單列索引 , 多列索引 , 空間索引
語法格式:
CREATE TABLE 表名 (
字段名1 數據類型 [完整性約束條件…],
字段名2 數據類型 [完整性約束條件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(長度)] [ASC |DESC])
);
示例 :
創建一個INDEX普通索引
CREATE TABLE dept(
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
index (dept_name) # 將表中的dept_name字段指定爲普通索引字段
);
創建一個UNIQUE唯一索引:
CREATE TABLE dept2 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
UNIQUE INDEX (dept_name)
);
相比普通索引來說 , 比上面的索引選項多了一個unique選項
創建一個全文索引;
CREATE TABLE dept3 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
log text,
FULLTEXT INDEX (log)
)engine=myisam;
注: 只有MYISAM存儲引擎支持全文索引,innodb存儲引擎不支持全文索引
創建多列索引
CREATE TABLE dept13 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
INDEX (dept_name, comment)
);
相比普通索引來說 , 就是將多個字段設置爲索引
對已存在的表創建索引
語法一:
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(長度)] [ASC |DESC]) ;
創建普通索引示例:此方法要指定索引名稱
CREATE INDEX index_dept_name ON dept6 (dept_name);
創建唯一索引示例:
CREATE UNIQUE INDEX index_dept_name ON dept6 (dept_name);
創建全文索引示例:
CREATE FULLTEXT INDEX index_dept_name ON dept6 (dept_name);
創建多列索引示例:
CREATE INDEX index_dept_name_ comment ON dept6 (dept_name, comment);
語法二:
ALTER TABLE在已存在的表上創建索引:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(長度)] [ASC |DESC]) ;
管理索引:
查看索引: show create table 表名\G
測試索引: explain select * from 表名 where 字段名='xx';
刪除索引: drop index 索引名 on 表名
索引檢測實例:
要求 : 創建一個school的數據庫 , 創建一張t2表 , 用存儲過程腳本t2表插入1000W條數據 , 然後查詢t2數據看看花費了多長時間 ; 再爲t2創建一個索引 , 再次查看數據看看所花費的時間
準備:
create database school #創建school數據庫
create table school.t2(id int,name varchar(30)); #創建一張t2表 , 裏面記錄id號和名字
定義一個插入1000W條數據的存儲過程 , 並調用此存儲過程
mysql> delimiter $$ 設置命令的界定符(也稱爲結束符)
mysql> create procedure autoinsert1() 創建autoinsert1這個存儲過程(類似於shell腳本)
-> BEGIN
-> declare i int default 1;
-> while(i<100000)do
-> insert into school.t2 values(i,'ccc');
-> set i=i+1;
-> end while;
-> END$$
mysql> delimiter ;
call atuoinsert1();
分兩次查詢數據 , 對比所花的時間(實驗中途插入1000W條數據花了33分鐘 , 插100W估計就能看出效果了):
從上述實驗可以看到 , 在一個存放1000W的表中 , 查詢一條數據跟創建索引後查詢一條數據相差了4S的時間 , 隨着數據更大 , 查詢時間也會不斷增大 , 所以足以證明 , 創建索引會大大提高MySQL的查詢工作效率!!!
二. MySQL存儲引擎介紹
存儲引擎說白了就是如何存儲數據、如何爲存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因爲在關係數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱爲表類型(即存儲和操作此表的類型)
在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而MySql數據庫提供了多種存儲引擎。用戶可以根據不同的需求爲數據表選擇不同的存儲引擎,用戶也可以根據自己的需要編寫自己的存儲引擎。
1. 查看存儲引擎
SHOW ENGINES;
SHOW ENGINES\G 查看MYSQL支持的存儲引擎
SHOW VARIABLES LIKE 'storage_engine%'; 查看當前的存儲引擎
SHOW VARIABLES LIKE 'auto_inc%'; 查看自增長的設置狀態
show global variables like '%connet%' 查看connet環境變量設置
mysql> show variables\G 查看所有的環境變量
show variables當前的會話
show global variables\G全局
2. 選擇存儲引擎
方法1.
mysql> create table innodb1(
-> id int
-> )engine=innodb;
mysql> show create table innodb1;
create tables test100(id init)engine=inodb;
方法2.
/etc/my.cnf
[mysqld] 在此行下添加下面的一行內容
default-storage-engine=INNODB
MySQL常用的存儲引擎
MyISAM存儲引擎
由於該存儲引擎不支持事務、也不支持外鍵,所以訪問速度較快。因此當對事務完整性沒有要求並以訪問爲主的應用適合使用該存儲引擎。
InnoDB存儲引擎(MYSQL默認用此存儲引擎)
由於該存儲引擎在事務上具有優勢,即支持具有提交、回滾及崩潰恢復能力等事務特性,所以比MyISAM存儲引擎佔用更多的磁盤空間。
因此當需要頻繁的更新、刪除操作,同時還對事務的完整性要求較高,需要實現併發控制,建議選擇。
MEMORY
MEMORY存儲引擎存儲數據的位置是內存,因此訪問速度最快,但是安全上沒有保障。適合於需要快速的訪問或臨時表。
BLACKHOLE
黑洞存儲引擎,可以應用於主備複製中的分發主庫。
使用BLACKHOLE存儲引擎的表不存儲任何數據,但如果mysql啓用了二進制日誌,SQL語句被寫入日誌(並被複制到從服務器)。這樣使用BLACKHOLE存儲引擎的mysqld可以作爲主從複製中的中繼重複器或在其上面添加過濾器機制。