首先sql優化,是一個比較大的話題,我不能說給某個表的某個欄位加索引就可以了,就innodb存盤引擎來說他采用是B+tree的方式
什么是B+tree呢,他的實作原理是二叉樹(好像不是?)如果這個欄位重復資料過多哪二叉樹就是以平行的方式展開加索引的意義不大
還浪費磁盤空間,我們呢要根基實際的業務情況來進行分析的,哪現在怎么說sql優化呢,我們說sql優化其實還是要了解mysql的
體系結構,是要知道一條SQL是怎么運行的我們才能更好的知道怎么去優化一條SQL!
當一條sql執行時首先呼叫
1:SQL介面:接受用戶的SQL命令,并且回傳用戶需要查詢的結果。
比如select from就是呼叫SQL Interface
2:是否開啟查詢快取:如果mysql開啟了查詢快取如果資料命中,MySQL會檢索用戶是否有權限,如果有mysql不會對sql進決議等操作
直接回傳結果資料,否則進入下一階段
優化點1:
MySQL將快取存放在一個參考表,(這不是一個table,類似于HashMap的資料結構),通過一個哈希值索引,這個哈希值通過查詢本身,
當前要查詢的資料庫,客戶端協議版本號等一些可能影響結果的資訊計算得來,所以2個查詢在任何字符上的不同(空格,注釋),都會
導致快取不命中
如果查詢中包含任何用戶自定義函式、存盤函式、用戶變數、臨時表、MySQL庫中的系統表,其查詢結果都不會被快取 eg:NOW()
查詢快取寫操作缺點:
MySQL查詢快取系統會跟蹤SQL查詢中涉及的每張表,當其中涉及查詢的表發生結構和資料的變化,即和這張表相關的所有快取資料
全部失效,也就是說在快取中的表的認為寫操作,MySQL都必須把對應的表設定為失效,如果查詢快取非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,
甚至導致系統僵死
查詢快取查詢操作缺點:
A:任何的查詢陳述句在開始之前都必須經過檢查,即使這條 SQL陳述句 永遠不會命中快取
B:如果查詢結果可以被快取,那么執行完成后,會將結果存入快取,也會帶來額外的系統消耗
查詢快取都會提高系統性能,快取和失效都會帶來額外系統消耗,特別是寫密集型應用(CPU占用高),只有當快取帶來的資源節約大于其本身消耗的資源時,
才會給系統帶來性能提升, 可以嘗試打開查詢快取,并在資料庫設計上做一些優化
A: 用多個小表代替一個大表,注意不要過度設計
B: 批量插入代替回圈單條插入
C: 合理控制快取空間大小,一般來說其大小設定為幾十兆比較合適(具體帶商榷?)
D: 可以通過 SQL_CACHE 和 SQL_NO_CACHE 來控制某個查詢陳述句是否需要進行快取
SQL_NO_CACHE 是禁止快取查詢結果,但并不意味著 cache 不作為結果回傳給 query,之前的快取結果之后也可以查詢到
使用方式:
SELECT SQL_CACHE COUNT(*) FROM A;COUNT(*)就是看看有多少條。。
可以在 SELECT 陳述句中指定查詢快取的選項,對于那些肯定要實時的從表中獲取資料的查詢,或者對于那些一天只執行一次的查詢,
都可以指定不進行查詢快取,使用 SQL_NO_CACHE 選項。對于那些變化不頻繁的表,查詢操作很固定,可以將該查詢操作快取起來
,這樣每次執行的時候不實際訪問表和執行查詢,只是從快取獲得結果,可以有效地改善查詢的性能,使用 SQL_CACHE 選項
對于查詢快取的一些操作
FLUSH QUERY CACHE : 清理查詢快取記憶體碎片
RESET QUERY CACHE : 從查詢快取中移出所有查詢
FLUSH TABLES : 關閉所有打開的表,同時該操作將會清空查詢快取中的內容
3:決議器:sql傳遞到決議器的時候會被決議器驗證和決議(決議器是由Lex和YACC實作的,是一個很長的腳本)
主要功能:1>將SQL陳述句分解成資料結構,并將這個結構傳到后續步驟,以后的sql陳述句的傳遞和處理就是基于這個結構
:2>如果SQL陳述句在分解成資料結構中遇到錯誤,哪就說明這個sql是不合理的
4:查詢優化器:SQL陳述句會使用查詢優化器對查詢進行優化。他使用的是“選取-投影-聯接”策略進行查詢。
用一個例子就可以理解: select id,name from user where name= Tom;
這個select 查詢先根據where 陳述句進行選取,而不是先將表全部查詢出來以后再進行name過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以后再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果
5:執行計劃 - 查詢執行引擎 - 呼叫API介面查詢 -( InnoDB,DBD...) - 資料庫
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/63901.html
標籤:MySQL
上一篇:Mysql死鎖問題
下一篇:access插入資料錯位問題
