本篇博客講的是MySQL的索引的功能和使用 , 以及存儲引擎的基本簡介
mysql
一. mysql索引算法
索引的簡介和做用sql
索引在MySQL中叫作"鍵" , 是存儲引擎用於快速找到記錄的一種數據結構 . 索引對良好的性能很是關鍵 , 尤爲是當表中的數據量愈來愈大時 , 索引對於性能的影響越來越發重要 .
shell
做用 : 經過必定的算法將數據庫中的記錄按必定的規律進行分組 , 這樣查信息時能夠縮小數據的搜索範圍 , 從而提升溜了查詢效率數據庫
用生活實例來講 , 索引就好像書的目錄 , 清單上的列表 ; 比如人去吃火鍋 , 當菜單拿到客戶手上 , 客戶能夠根據菜單上的分類(海鮮 , 蔬菜類 , 肉類 , 飲料類等) , 根據本身的口味能第一時間找到本身想吃的菜 .安全
索引的分類bash
索引可分爲 : 普通索引 , 惟一索引 , 全文索引 , 單列索引 , 多列索引 , 空間索引服務器
語法格式:數據結構
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能夠做爲主從複製中的中繼重複器或在其上面添加過濾器機制。