儘可能避免全表掃描,在常常用來搜索的字段上創建索引。html
經過EXPLAIN來查看SQL語句執行效果,explain select * from mysql
避免使用select * from ,用具體的字段表明*sql
查詢儘量使用limit,減小返回的行數數據庫
避免在where子句中使用函數、運算,不然會放棄索引而使用全表掃描。緩存
儘可能避免使用or,or可能會致使放棄索引,可使用union all 安全
select id from t where num=10 or num=20
能夠這樣查詢:
select id from t where num=10
union all
select id from t where num=20 服務器
按列進行拆分,若是表中一些列經常使用,而另一些不經常使用,就能夠將他們拆分開來。併發
水平拆分:app
一個表中數據量特別多時,將該表水平地拆分多個表。負載均衡
選擇多核和主頻高的 CPU; 使用更大的內存,將更多內存分配給MySQL
更新不頻繁的表。
除了上面的優化,還能夠主從複製、讀寫分離、負載均衡
經過設置主從數據庫實現讀寫分離,主數據庫負責「寫操做」,從數據庫負責「讀操做」,根據壓力狀況,從數據庫能夠部署多個提升「讀」的速度,藉此來提升系統整體的性能。
mysql 主(稱master)從(稱slave)複製的原理:
(1)master 將數據改變記錄到二進制日誌(binary log)中,也便是配置文件log-bin 指定
的文件(這些記錄叫作二進制日誌事件,binary log events)
PS:從圖中能夠看出,Slave 服務器中有一個I/O 線程(I/O Thread)在不停地監聽Master
的二進制日誌(Binary Log)是否有更新:若是沒有它會睡眠等待Master 產生新的日誌事件;
若是有新的日誌事件(Log Events),則會將其拷貝至Slave 服務器中的中繼日誌(Relay
Log)。
(2).slave 將master 的二進制日誌事件(binary log events)拷貝到它的中繼日誌(relay
log)
(3).slave 重作中繼日誌中的事件,將Master 上的改變反映到它本身的數據庫中。,所
以兩端的數據是徹底同樣的。
表:學號, 姓名, 年齡, 課程名稱, 成績, 學分;
這個代表顯說明了兩個事物:學生信息, 課程信息。
學號, 姓名, 年齡, 所在學院, 學院地點,學院聯繫電話,主鍵爲"
學號「;
存在依賴傳遞: (學號) → (所在學院) → (學院地點, 學院電話)
drop直接刪掉表 truncate刪除表中數據,再插入時自增加id又從1開始 ;delete刪除表中數據,能夠加where字句,delete的自增加id不會變,從上一個最大值開始
當你再也不須要該表時, 用 drop;當你仍要保留該表,但要刪除全部記錄時, 用 truncate;當你要刪除部分記錄時(always with a WHERE clause), 用 delete.
事務是由一系列SQL語句組成的一系列操做
原子性:一個事務的全部操做,要麼所有成功,要麼都不成功。
一致性:事務執行先後保證數據的完整性。好比轉帳,總金額不變
隔離性:一個事務的執行,不能受其餘事務的干擾。
持久性:一個事務一旦執行成功,它對數據的修改就是永久性的。
髒讀:讀到另外一個事務未提交的數據。
不可重複讀:對一個事物兩次讀取不一致,另外一個事物作了修改。
幻讀:對一張表兩次查詢不一致,另外一個事務插入或刪除了記錄,出現幻行、。
加鎖。樂觀鎖、悲觀鎖、行鎖、表鎖。看鎖的文章
讀未提交數據:能夠讀未提交的數據。髒讀、不可重複讀、幻讀
讀已提交數據:避免髒讀。可能有不可重複讀、幻讀
可重複讀:避免了髒讀和不可重複讀。同一事物屢次讀取一樣記錄結果一致。可是不能解決幻讀。由於另外一個事務插入記錄,會出現幻行。MySQL默認該隔離級 別。同時,InnoDB引擎使用間隙鎖解決了幻讀問題。
串行化:強制事物串行執行,沒有併發,也就沒有問題。
優勢:
1.大大加快數據的檢索速度。
2.建立惟一索引,保證表中每一行數據惟一。
缺點:
1. 佔用物理內存
2.對錶中數據進行增長刪減時,索引須要動態維護。
儘可能選擇區分度高的字段做爲索引。好比性別,區分度就不高。
惟一索引:在表上一個或者多個字段組合創建的索引,這個或者這些字段組合值在表中是不可重複的,好比主鍵就能夠做爲惟一索引。
主鍵索引(主索引):這是惟一索引的特例。一個表只能有一個主索引。
組合索引:基於多個字段的索引。 建立索引 create index idx1 on table1(col1,col2,col3) 查詢 select * from table1 where col1= A and col2= B and col3 = C
CREATE UNIQUE INDEX index_name ON table_name (column_list)
ALTER TABLE table_name ADD INDEX index_name (column_list)
http://www.javashuo.com/article/p-yhpqgfto-q.html
Mysql 數據庫中,最經常使用的兩種引擎是innordb 和myisam。InnoDB 是Mysql 的默認存儲引擎。
1.MyISAM 不提供事務支持。InnoDB 提供事務支持事務。
2.MyISAM 不支持外鍵,InnoDB 支持外鍵。
3.鎖MyISAM 只支持表級鎖,InnoDB 支持行級鎖和表級鎖,默認是行級鎖,行鎖大幅度提升了多用戶併發操做的性能。innodb 比較適合於插入和更新操做比較多的狀況,而myisam 則適合用於頻繁查詢的狀況。
4.MyISAM 支持全文索引, InnoDB 不支持全文索引
5.MyISAM:容許沒有主鍵的表存在。InnoDB:若是沒有設定主鍵,就會自動生成一個6 字節的主鍵(用戶不可見)
若是表的類型是MyISAM,那麼是18。由於MyISAM 表會把自增主鍵的最大ID 記錄到數據文件裏,重啓MySQL 自增主鍵的最大ID 也不會丟失。若是表的類型是InnoDB,那麼是15。InnoDB 表只是把自增主鍵的最大ID 記錄到內存中,因此重啓數據庫會致使最大ID 丟失。
1.對於組合索引,不是使用的第一部分,則不會使用索引。
2.or 語句先後沒有同時使用索引。要想使用or,又想讓索引生效,只能將or 條件中的每一個
列都加上索引。
3.若是列類型是字符串,那必定要在條件中使用引號引發來,不然不會使用索引。
4.若是mysql 估計使用全表描述比使用索引快,則不使用索引。
5.在索引列上作運算或者使用函數。
6.以「%」開頭的LIKE 查詢,模糊匹配。
MyISAM使用的是表鎖,會給整張表加鎖,不會出現死鎖。
InnoDB使用行鎖和表鎖,默認行鎖,行鎖會產生死鎖。
InnoDB行鎖是經過給索引加鎖來實現的。也就是說,並非給記錄加鎖,而是索引加鎖,若是沒有使用索引,那麼InnoDB仍是會使用表鎖。
雖然訪問不一樣的行,可是若是使用的是相同的索引,那麼仍是會出現衝突。
當兩個事務同時執行,一個鎖住了主鍵索引,在等待其餘相關索引。另外一個鎖定了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖。
發生死鎖後,InnoDB通常均可以檢測到,將持有最少行級鎖的事務回滾。
有多種方法能夠避免死鎖,這裏只介紹常見的三種
一、若是不一樣程序會併發存取多個表,儘可能約定以相同的順序訪問表,能夠大大下降死鎖機會。
二、在同一個事務中,儘量作到一次鎖定所須要的全部資源,減小死鎖產生機率;
三、對於很是容易產生死鎖的業務部分,能夠嘗試使用升級鎖定顆粒度,經過表級鎖定來減小死鎖產生的機率;
隔離性:經過鎖實現
原子性和一致性:經過回滾日誌(undo log)實現。全部事務進行的修改都會先記錄到這個回滾日誌中,而後在對數據庫中的對應行進行寫入。當出現錯誤或者須要rollback時,只會按照日誌邏輯地將數據庫中的修改撤銷掉看
持久性:經過重作日誌(redo Log)實現。重作日誌由兩部分組成,一是內存中的重作日誌緩衝區,由於重作日誌緩衝區在內存中,因此它是易失的,另外一個就是在磁盤上的重作日誌文件,它是持久的。當咱們在一個事務中嘗試對數據進行修改時,它會先將數據從磁盤讀入內存,並更新內存中緩存的數據,而後生成一條重作日誌並寫入重作日誌緩存,當事務真正提交時,MySQL 會將重作日誌緩存中的內容刷新到重作日誌文件,再將內存中的數據更新到磁盤上。在發生錯誤後,數據庫重啓時會從重作日誌中找出未被更新到數據庫磁盤中的日誌從新執行以知足事務的持久性。
聚簇索引的葉子節點就是數據節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應數據塊的指針。
內鏈接 則是隻有條件的交叉鏈接,根據某個條件篩選出符合條件的記錄,不符合條件的記錄不會出如今結果集中,即內鏈接只鏈接匹配的行。
外鏈接 其結果集中不只包含符合鏈接條件的行,並且還會包括左表、右表或兩個表中
的全部數據行,這三種狀況依次稱之爲左外鏈接,右外鏈接,和全外鏈接。
左外鏈接,也稱左鏈接,左表爲主表,左表中的全部記錄都會出如今結果集中,對於那些在右表中並無匹配的記錄,仍然要顯示,右邊對應的那些字段值以NULL來填充。右外鏈接,也稱右鏈接,右表爲主表,右表中的全部記錄都會出如今結果集中。左鏈接和右鏈接能夠互換,MySQL目前還不支持全外鏈接。
視圖是一種虛擬的表,具備和物理表相同的功能。能夠對視圖進行增,改,查,操做,視圖是從一個或幾個基本表導出的表。對視圖的修改不影響基本表。它使得咱們獲取數據更容易,相比多表查詢。
主鍵--惟一標識一條記錄,不能有重複的,不容許爲空
外鍵--表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值
主鍵--主鍵只能有一個
外鍵--一個表能夠有多個外鍵
答:NULL這個值表示UNKNOWN(未知):它不表示「」(空字符串)。對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 NULL值進行比較,並在邏輯上但願得到一個答案。
答:是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是:
char(M)類型的數據列裏,每一個值都佔用M個字節,若是某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操做中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列裏,每一個值只佔用恰好夠用的字節再加上一個用來記錄其長度的字節(即總長度爲L+1字節).
視圖(view)是一種虛擬存在的表,是一個邏輯表,自己並不包含數據。做爲一個select語句保存在數據字典中的。
經過視圖,能夠展示基表的部分數據;視圖數據來自定義視圖的查詢中使用的表,使用視圖動態生成。
存儲過程和函數是事先通過編譯並存儲在數據庫中的一段SQL 語句的集合,調用存儲過程和函數能夠簡化應用開發人員的不少工做,減小數據在數據庫和應用服務器之間的傳輸,對於提升數據處理的效率是有好處的。存儲過程和函數的區別在於函數必須有返回值,而存儲過程沒有。
觸發器是一個特殊的存儲過程,執行存儲過程須要使用CALL語句來調用,可是觸發器的執行不須要用CALL語句調用,也不須要手工啓動,只要的當一個預約義的事件發生時,就會被MYSQL自動調用。好比當對fruits表進行INSERT,DELETE或UPDATE操做時就會激活它。觸發器能夠查詢數據表,並且能夠包含複雜的SQL語句,主要用於複雜的業務規則或要求。
一個表中的 FOREIGN KEY 指向另外一個表中的 PRIMARY KEY。經過外鍵與其餘表創建關係。
|
主鍵 |
外鍵 |
索引 |
定義: |
惟一標識一條記錄,不能有重複的,不容許爲空 |
表的外鍵是另外一表的主鍵, 外鍵能夠有重複的, 能夠是空值 |
該字段沒有重複值,但能夠有一個空值 |
做用: |
用來保證數據完整性 |
用來和其餘表創建聯繫用的 |
是提升查詢排序的速度 |
個數: |
主鍵只能有一個 |
一個表能夠有多個外鍵 |
一個表能夠有多個唯一索引 |