1.1 原子性: 事務是最小的執行單位,不容許分割。事務的原子性確保動做要麼所有完成,要麼徹底不起做用;
1.2 一致性: 執行事務先後,數據庫從一個一致性狀態轉換到另外一個一致性狀態。
1.3 隔離性: 併發訪問數據庫時,一個用戶的事物不被其餘事務所幹擾,各併發事務之間數據庫是獨立的;
1.4 持久性: 一個事務被提交以後。它對數據庫中數據的改變是持久的,即便數據庫 發生故障也不該該對其有任何影響。mysql
2.1 READ_UNCOMMITTED(未提交讀): 最低的隔離級別,容許讀取還沒有提交的數據變動,可能會致使髒讀、幻讀或不可重複讀
2.2 READ_COMMITTED(提交讀): 容許讀取併發事務已經提交的數據,能夠阻止髒讀,可是幻讀或不可重複讀仍有可能發生
2.3 REPEATABLE_READ(可重複讀): 對同一字段的屢次讀取結果都是一致的,除非數據是被自己事務本身所修改,能夠阻止髒讀和不可重複讀,但幻讀仍有可能發生。
2.4 SERIALIZABLE(串行): 最高的隔離級別,徹底服從ACID的隔離級別。全部的事務依次逐個執行,這樣事務之間就徹底不可能產生干擾,也就是說,該級別能夠防止髒讀、不可重複讀以及幻讀。可是這將嚴重影響程序的性能。一般狀況下也不會用到該級別。sql
Mysql 默認採用的 REPEATABLE_READ隔離級別
索引是一種幫助MySQL高效獲取數據的數據結構
優點:數據庫
劣勢:數據結構
使用EXPLAIN關鍵字能夠模擬優化器執行SQL查詢語句, 從而知道MYSQL是如何處理你的SQL語句的,分析你的查詢語句或是表結構的性能瓶頸
a、id併發
①id相同,執行順序由上至下函數
②id不一樣,id值越大優先級越高,越先被執行高併發
b、select_type性能
查詢的類型,主要是用於區別普通查詢、聯合查詢、子查詢等的複雜查詢
c、table優化
顯示這行的數據是關於哪張表的。
d、type(最好到最差的順序)spa
備註:通常來講,得保證查詢至少達到range級別,最好能達到ref
e、possible_keys
可能應用到這張表的索引
f、key
實際使用的索引
g、key_len
索引使用的字節數,在不損失精確性的狀況下,長度越短越好
h、ref
顯示索引的哪一列被使用了
i、rows
大體估算出找到所需記錄所須要讀取的行數
j、Extra
優化策略: 增大sort_buffer_size參數的設置、增大max_length_for_sort_data參數的設置
實質是先排序後進行分組,遵守索引鍵的最佳左前綴,當沒法使用索引列時,增大sort_buffer_size+max_length_for_sort_data參數的設置
MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。 具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值爲10,意思是運行10秒以上的語句。 由他來查看哪些SQL超出了咱們的最大忍耐時間值,好比一條sql執行超過5秒鐘,咱們就算慢SQL,但願能收集超過5秒的sql,結合以前explain進行全面分析。
默認狀況下,MySQL數據庫沒有開啓慢查詢日誌,須要咱們手動來設置這個參數。(固然,若是不是調優須要的話,通常不建議啓動該參數,由於開啓慢查詢日誌會或多或少帶來必定的性能影響。慢查詢日誌支持將日誌記錄寫入文件。)
-- 查看開啓狀況 SHOW VARIABLES LIKE '%slow_query_log%'; -- 開啓(只對當前數據庫生效,若是要永久生效,就必須修改配置文件my.cnf) set global slow_query_log=1;
mysql提供能夠用來分析當前會話中語句執行的資源消耗狀況。能夠用於SQL的調優的測量,相比explain,show profile展現的數據更加詳盡。
-- 查看是否開啓 show variables like 'profiling'; -- 開啓功能,默認是關閉,使用前須要開啓 set profiling=1; -- 查看結果 show profiles; -- 診斷SQL show profile cpu,block io for query n; -- 還能夠經過SELECT * FROM information_schema.profiling WHERE query_id = n ORDER BY seq;獲取