一、索引:做用於表中的某列,並將其進行排序,有助於快速地進行查詢。mysql
索引是對數據庫表中一個或多個列的值進行排序的數據結構,是用於提升在數據庫表中訪問數據的速度的數據庫對象。其實索引至關於一本書的目錄,若是沒有索引,要想在數據庫中查找某一特定的值就須要遍歷整個數據庫表,可是有了索引以後就能夠在索引當中查找,有助於更快地獲取信息;sql
索引可分爲彙集索引和非彙集索引;數據庫
彙集索引:是按照數據存放的物理位置爲順序的;緩存
非彙集索引中,表數據存儲順序與索引順序無關;一張表上只能建立一個彙集索引,由於真實數據的物理順序只多是一種;若是一張表沒有彙集索引,那麼它被稱爲「堆集」,這樣的表中的數據行沒有特定的順序,全部的新行將被添加到表的末尾位置。安全
一條索引記錄中包含的基本信息有:鍵值(定義索引時指定的全部字段的值)+邏輯指針(指向數據頁或另外一索引頁);根據數據庫的功能,能夠在數據庫設計器中建立三種索引:服務器
(1)惟一索引:不容許其中任何兩行具備相同索引值的索引;網絡
當現有數據中存在重複的鍵值時,大多數數據庫不容許將新建立的惟一索引與表一塊兒保存。數據庫還可能防止添加將在表中建立重複鍵值的新數據。數據結構
使用語句爲:併發
CREATE UNIQUE INDEX 索引名稱數據庫設計
ON 表名稱 (列名稱,若是爲多個列用逗號隔開)
對於一個簡單索引的建立,只需將惟一索引中的UNIQUE去掉就能夠了;
(2)主鍵索引:數據庫表常常有一列或多列組合,其值惟一標識表中的每一行,該列稱爲表的主鍵;
在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問;
(3)彙集索引:在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引;若是某索引不是彙集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非彙集索引相比,彙集索引一般提供更快的數據訪問速度。
雖說創建索引的目的是加快對錶中記錄的查找或排序,可是爲表設置索引要付出代價的:一是增長了數據庫的存儲空間,二是在插入和修改數據時要花費較多的時間(由於索引也要隨之變更)。
數據庫索引就是爲了提升表的搜索效率而對某些字段中的值創建的目錄 ;其各有優缺點:
1)優勢:
建立索引能夠大大提升系統的性能
經過建立惟一性索引,能夠保證數據庫表中每一行數據的惟一性;
能夠大大加快數據的檢索速度,這也是建立索引的最主要的緣由;
能夠加速表和表之間的鏈接,特別是在實現數據的參考完整性方面特別有意義;
在使用分組和排序子句進行數據檢索時,一樣能夠顯著減小查詢中分組和排序的時間;
經過使用索引,能夠在查詢的過程當中,使用優化隱藏器,提升系統的性能。
2)缺點:
建立索引和維護索引要耗費時間,這種時間隨着數據量的增長而增長;
索引須要佔物理空間,除了數據表佔數據空間以外,每個索引還要佔必定的物理空間,若是要創建聚簇索引,那麼須要的空間就會更大;
當對錶中的數據進行增長、刪除和修改的時候,索引也要動態的維護,這樣就下降了數據的維護速度。
所以,對於索引的使用和創建,應該視狀況而定,好比對於那些查詢次數不多或者數據值也比較少的列就沒必要要創建索引,由於不只不能提升多少查詢速度,反而會耗費必定的空間和下降系統的維護程度。
語法格式以下:
create or replace index index_name |
相關命令:
查看一張表上的索引
Show index from 表名 \G 是以列來顯示
創建索引
Alter table 表名 add [ index / unique index / fulltext / primary key / ] 【索引名(可選)】 (列名)
Alter table member add index tel (tel); 普通索引
Alter table member add unique (email) 惟一索引
Alter table member add fulltext (intro) 全文索引
主鍵 索引
Alter table member add primary key (列名) 不用寫索引名 由於索引就這一個
Alter table member add primary key (id) 主鍵
刪除索引
Alter table 表名 drop index 索引名 最後是寫索引名
Alter table member drop index intro 刪除索引
可是怎麼刪除主鍵索引呢 主鍵索引 沒有索引名 直接寫primary key 就行了
Alter table member drop primary key
導入導出的時候 就先刪除 表的索引 而後在集中創建索引
索引建立原則
不要過分索引
索引儘可能散列值
在where條件最頻繁的值上加索引
全文索引
在mysql 默認設定中 對中文意義不大
若是是大文章的話 沒有用全文索引 找一個詞 要用 like 那是一行一行的找 效率 很低很低的
全文索引查找方式
Select * from member where match(列名) against('查詢內容');
Select * from member where match(initr) against('databases');
通常不少詞 都是中止詞 因此索引不出來
能夠查看某個單詞的匹配度
Select match('intro') against('data') from member;
全文索引在默認狀況下對中文的意義不大,全文索引是針對文章中每個詞 作索引的
二、觸發器:是數據庫在進行某種操做以前或以後進行的操做。
(1)觸發器是一種特殊類型的存儲過程,它在指定的表中的數據進行變化的時候自動生效;觸發器是一個特殊的事務單元,能夠引用其餘表中的列執行特殊的業務規則或數據邏輯關係。
當出現錯誤時,能夠執行rollback transaction操做將整個觸發器以及觸發它的T-SQL語句一併回滾(不需顯示聲明begin transaction);喚醒調用觸發器以響應INSERT、UPDATE 或 DELETE 語句。觸發器能夠查詢其它表,並能夠包含複雜的Transact-SQL語句。將觸發器和觸發它的語句做爲可在觸發器內回滾的單個事務對待。若是檢測到嚴重錯誤(例如,磁盤空間不足),則整個事務即自動回滾,即撤銷。
(2)觸發器類型【兩種】:
AFTER觸發器:這種觸發器將在數據變更(insert、update、delete動做)完成之後才觸發。對變更的數據進行檢查,若是發現錯誤,則拒絕或回滾變更的數據;
INSTEAD OF觸發器:這種觸發器將在數據變更之前被觸發,並取代變更數據的操做(insert、update、delete操做),轉而去執行觸發器定義的操做;
在創建觸發器時,還必須指定觸發操做:insert、update、delete操做,至少指定一種,也可指定多種;
(3) 建立觸發器:
CREATE TRIGGER trigger_name//觸發器名稱 |
三、事務:是一個或一組邏輯單元,由多個SQL語句組成,能夠對數據庫上的對象進行操做。
(1)事務(Database Transaction) ,是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。 事務處理能夠確保除非事務性單元內的全部操做都成功完成,不然不會永久更新面向數據的資源。經過將一組相關操做組合爲一個要麼所有成功要麼所有失敗的單元,能夠簡化錯誤恢復並使應用程序更加可靠。
(2)相關屬性:
①原子性(Atomicity):事務中的全部元素做爲一個總體提交或回滾,事務的個元素是不可分的,事務是一個完整操做。
②一致性(Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始以前,數據存儲中的數據處於一致狀態。保證數據的無損。
③隔離性(Isolation):對數據進行修改的多個事務是彼此隔離的。這代表事務必須是獨立的,不該該以任何方式以來於或影響其餘事務。
④持久性(Durability):事務完成以後,它對於系統的影響是永久的,該修改即便出現系統故障也將一直保留,真實的修改了數據庫。
(3)三種模型:
隱式事務是指每一條數據操做語句都自動地成爲一個事務,事務的開始是隱式的,事務的結束有明確的標記;
顯式事務是指有顯式的開始和結束標記的事務,每一個事務都有顯式的開始和結束標記;
自動事務是系統自動默認的,開始和結束不用標記;
(4)使用事務的語句:
開始事物:BEGIN TRANSACTION
提交事物:COMMIT TRANSACTION
回滾事務:ROLLBACK TRANSACTION
(5)事務的保存點:
SAVE TRANSACTION 保存點名稱 ——自定義保存點的名稱和位置
ROLLBACK TRANSACTION 保存點名稱 ——回滾到自定義的保存點
四、存儲引擎:
(1)MySQL 中的數據用各類不一樣的技術存儲在文件(或者內存)中,這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能 力,經過選擇不一樣的技術,可以得到額外的速度或者功能,從而改善應用的總體功能。這些不一樣的技術以及配套的相關功能在MySQL中被稱做存儲引擎(也稱做表類型);
MySQL默認配置了許多不一樣的存儲引擎,能夠預先設置或者在MySQL服務器中啓用。能夠選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及須要數據結合什麼性能和功能的時候能提供最大的靈活性。
(2)經常使用的存儲引擎:
I 、 MyISAM
特性
不支持事務:MyISAM存儲引擎不支持事務,因此對事務有要求的業務場景不能使用
表級鎖定:其鎖定機制是表級索引,這雖然可讓鎖定的實現成本很小可是也同時大大下降了其併發性能
讀寫互相阻塞:不只會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀
只會緩存索引:MyISAM能夠經過key_buffer緩存以大大提升訪問性能減小磁盤IO,可是這個緩存區只會緩存索引,而不會緩存數據
適用場景
不須要事務支持(不支持)
併發相對較低(鎖定機制問題)
數據修改相對較少(阻塞問題)
以讀爲主
數據一致性要求不是很是高
最佳實踐
儘可能索引(緩存機制)
調整讀寫優先級,根據實際需求確保重要操做更優先
啓用延遲插入改善大批量寫入性能
儘可能順序操做讓insert數據都寫入到尾部,減小阻塞
分解大的操做,下降單個操做的阻塞時間
下降併發數,某些高併發場景經過應用來進行排隊機制
對於相對靜態的數據,充分利用Query Cache能夠極大的提升訪問效率
MyISAM的Count只有在全表掃描的時候特別高效,帶有其餘條件的count都須要進行實際的數據訪問
II、 InnoDB
特性
具備較好的事務支持:支持4個事務隔離級別,支持多版本讀
行級鎖定:經過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響
讀寫阻塞與事務隔離級別相關
具備很是高效的緩存特性:能緩存索引,也能緩存數據
整個表和主鍵以Cluster方式存儲,組成一顆平衡樹
全部Secondary Index都會保存主鍵信息
適用場景
須要事務支持(具備較好的事務特性)
行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成
數據更新較爲頻繁的場景
數據一致性要求較高
硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率,儘量減小磁盤 IO
最佳實踐
主鍵儘量小,避免給Secondary index帶來過大的空間負擔
避免全表掃描,由於會使用表鎖
儘量緩存全部的索引和數據,提升響應速度
在大批量小插入的時候,儘可能本身控制事務而不要使用autocommit自動提交
合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性
避免主鍵更新,由於這會帶來大量的數據移動
III、 NDBCluster
特性
分佈式:分佈式存儲引擎,能夠由多個NDBCluster存儲引擎組成集羣分別存放總體數據的一部分
支持事務:和Innodb同樣,支持事務
可與mysqld不在一臺主機:能夠和mysqld分開存在於獨立的主機上,而後經過網絡和mysqld通訊交互
內存需求量巨大:新版本索引以及被索引的數據必須存放在內存中,老版本全部數據和索引必須存在與內存中
適用場景
具備很是高的併發需求
對單個請求的響應並非很是的critical
查詢簡單,過濾條件較爲固定,每次請求數據量較少,又不但願本身進行水平Sharding
最佳實踐
儘量讓查詢簡單,避免數據的跨節點傳輸
儘量知足SQL節點的計算性能,大一點的集羣SQL節點會明顯多餘Data節點
在各節點之間儘量使用萬兆網絡環境互聯,以減小數據在網絡層傳輸過程當中的延時
注:以上三個存儲引擎是目前相對主流的存儲引擎,還有其餘相似如:Memory,Merge,CSV,Archive等存儲引擎的使用場景都相對較少。
查看當前數據庫中各表的引擎:
SHOW TABLE STATUS FROMDBname |
建立一個新表時,能夠經過在CREATE語句中ENGINE或TYPE選項來告訴MySQL要建立什麼類型的表:
CREATE TABLE t (i INT) ENGINE = INNODB; |
若是省略掉ENGINE或TYPE選項,默認的存儲引擎被使用。當MySQL被用MySQL配置嚮導安裝在Windows平臺上,InnoDB存儲引擎替代MyISAM存儲引擎做爲默認。當不可用的類型被指定時,自動用InnoDB表來替代。
使用ALTERTABLE語句,把表從一個類型轉到另外一個類型:
ALTER TABLE t ENGINE = MYISAM; |