數據庫 MySQL part4
存儲引擎
什麽是存儲引擎?
mysql中建的庫是文件夾,建的表是文件。文件有不同的類型,數據庫中的表也有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。
存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因為在關系數據庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和
操作此表的類型)
mysql支持的存儲引擎
show engines\G; #查看所有支持的存儲引擎 show variables like ‘%storage_engine%‘; #查看正在使用的存儲引擎
mysql常用存儲引擎
1、MyISAM存儲引擎
由於該存儲引擎不支持事務、也不支持外鍵,所以訪問速度較快。因此當對事務完整性沒有要求並以訪問為主的應用適合使用該存儲引擎。
2、InnoDB存儲引擎(主要使用也是默認)
由於該存儲引擎在事務上具有優勢,即支持具有提交、回滾及崩潰恢復能力等事務特性,所以比MyISAM存儲引擎占用更多的磁盤空間。因此當需要頻繁的更新、刪除操作,同時還對事務的完整性要求較高,需要實現並發控制,建議選擇。
3、MEMORY
MEMORY存儲引擎存儲數據的位置是內存,因此訪問速度最快,但是安全上沒有保障。適合於需要快速的訪問或臨時表。在重啟mysql或者重啟機器後,表內數據清空。
4、BLACKHOLE
黑洞存儲引擎,可以應用於主備復制中的分發主庫。往表內插入任何數據,都相當於丟入黑洞,表內永遠不存記錄
指定存儲引擎
1、建表時候指定
create table innodb_t1 (id int,name char) engine=innodb; create table innodb_t2 (id int) engine=innodb;
2、配置文件指定
[mysqld] default-storage-engine=INNODB innodb_file_per_table=1
3、查看
進入庫文件夾、查看文件後綴名,不同的存儲引擎的文件後綴不同,黑洞和內存引擎只有表結構文件,沒有數據文件
聯合主鍵
主鍵的特點:
1、每張表只能有一個主鍵
2、每張表不一定只有一個非空且唯一的字段
3、如果表中只有一個非空且唯一字段,那它就是主鍵,如果表中不只有一個非空且唯一字段,那第一個非空切唯一的字段就是主鍵
聯合主鍵:
聯合主鍵是由多個字段組成,如下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
數據庫 MySQL part4