存儲引擎mysql
什麼是存儲引擎?算法
mysql中建的庫是文件夾,建的表是文件。文件有不一樣的類型,數據庫中的表也有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎。sql
存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和
操做此表的類型)數據庫
mysql支持的存儲引擎安全
show engines\G; #查看全部支持的存儲引擎 show variables like '%storage_engine%'; #查看正在使用的存儲引擎
mysql經常使用存儲引擎性能優化
一、MyISAM存儲引擎
因爲該存儲引擎不支持事務、也不支持外鍵,因此訪問速度較快。所以當對事務完整性沒有要求並以訪問爲主的應用適合使用該存儲引擎。數據結構
二、InnoDB存儲引擎(主要使用也是默認)
因爲該存儲引擎在事務上具備優點,即支持具備提交、回滾及崩潰恢復能力等事務特性,因此比MyISAM存儲引擎佔用更多的磁盤空間。所以當須要頻繁的更新、刪除操做,同時還對事務的完整性要求較高,須要實現併發控制,建議選擇。併發
三、MEMORY
MEMORY存儲引擎存儲數據的位置是內存,所以訪問速度最快,可是安全上沒有保障。適合於須要快速的訪問或臨時表。在重啓mysql或者重啓機器後,表內數據清空。函數
四、BLACKHOLE
黑洞存儲引擎,能夠應用於主備複製中的分發主庫。往表內插入任何數據,都至關於丟入黑洞,表內永遠不存記錄 性能
指定存儲引擎
一、建表時候指定
create table innodb_t1 (id int,name char) engine=innodb; create table innodb_t2 (id int) engine=innodb;
二、配置文件指定
[mysqld] default-storage-engine=INNODB innodb_file_per_table=1
三、查看
進入庫文件夾、查看文件後綴名,不一樣的存儲引擎的文件後綴不一樣,黑洞和內存引擎只有表結構文件,沒有數據文件
聯合主鍵
主鍵的特色:
一、每張表只能有一個主鍵
二、每張表不必定只有一個非空且惟一的字段
三、若是表中只有一個非空且惟一字段,那它就是主鍵,若是表中不僅有一個非空且惟一字段,那第一個非空切惟一的字段就是主鍵
聯合主鍵:
聯合主鍵是由多個字段組成,以下student_id 和 teacher_id 共同組成表的主鍵,這樣就能夠在student表和teacher表在多對多的關係下,在此表中,既不會存在徹底重複的記錄,形成無用的重複數據,也不會使得重要數據爲空,致使數據無效。(注:示例爲多對多的關係表,並未設置外鍵約束)
CREATE TABLE student_to_teacher ( id int NOT NULL UNIQUE AUTO_INCREMENT, student_id int, teacher_id int, PRIMARY KEY (student_id, teacher_id) ); DESC student_to_teacher; +------------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------+------+-----+---------+----------------+ | id | int(11) | NO | UNI | NULL | auto_increment | | student_id | int(11) | NO | PRI | NULL | | | teacher_id | int(11) | NO | PRI | NULL | | +------------+---------+------+-----+---------+----------------+ 3 rows in set (0.05 sec)
索引
索引在MySQL中也叫作「鍵」,是存儲引擎用於快速找到記錄的一種數據結構。索引對於良好的性能很是關鍵,尤爲是當表中的數據量愈來愈大時,索引對於性能的影響愈發重要。
索引優化應該是對查詢性能優化最有效的手段了。
索引可以輕易將查詢性能提升好幾個數量級。
索引至關於字典的音序表,若是要查某個字,若是不使用音序表,則須要從幾百頁中逐頁去查。
索引特色:建立與維護索引會消耗不少時間與磁盤空間,但查詢速度大大提升!
建立索引時候會用到一系列算法,如hash、二叉樹、紅黑樹等
建立索引
INDEX和KEY都是索引
語法:
CREATE TABLE 表名 ( 字段名1 數據類型 [完整性約束條件…], 字段名2 數據類型 [完整性約束條件…], [UNIQUE] INDEX | KEY [索引名] (字段名[(長度)] [ASC |DESC]) );
示例:
--建立普通索引示例: CREATE TABLE emp1 ( id INT, name VARCHAR(30) , resume VARCHAR(50), INDEX index_emp_name (name) --KEY index_dept_name (dept_name) ); --建立惟一索引示例: CREATE TABLE emp2 ( id INT, name VARCHAR(30) , bank_num CHAR(18) UNIQUE , resume VARCHAR(50), UNIQUE INDEX index_emp_name (name) ); --建立全文索引示例: CREATE TABLE emp3 ( id INT, name VARCHAR(30) , resume VARCHAR(50), FULLTEXT INDEX index_resume (resume) ); --建立多列索引示例: CREATE TABLE emp4 ( id INT, name VARCHAR(30) , resume VARCHAR(50), INDEX index_name_resume (name,resume) );
練習:
--建立表 create table Indexdb.t1(id int,name varchar(20)); --存儲過程 delimiter $$ create procedure autoinsert() BEGIN declare i int default 1; while(i<500000)do insert into Indexdb.t1 values(i,'yuan'); set i=i+1; end while; END$$ delimiter ; --調用函數 call autoinsert(); -- 花費時間比較: -- 建立索引前 select * from Indexdb.t1 where id=300000;--0.32s -- 添加索引 create index index_id on Indexdb.t1(id); -- 建立索引後 select * from Indexdb.t1 where id=300000;--0.00s