您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL規范知識有哪些”,在日常操作中,相信很多人在MySQL規范知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL規范知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
建立索引的目的是:希望通過索引進行數據查找,減少隨機 IO,增加查詢性能 ,索引能過濾出越少的數據,則從磁盤中讀入的數據也就越少。
區分度最高的放在聯合索引的最左側(區分度 = 列中不同值的數量 / 列的總行數)。
盡量把字段長度小的列放在聯合索引的最左側(因為字段長度越小,一頁能存儲的數據量越大,IO 性能也就越好)。
使用最頻繁的列放到聯合索引的左側(這樣可以比較少的建立一些索引)。
七、避免建立冗余索引和重復索引
因為這樣會增加查詢優化器生成執行計劃的時間。
重復索引示例:primary key(id)、index(id)、unique index(id)
冗余索引示例:index(a,b,c)、index(a,b)、index(a)
八、優先考慮覆蓋索引
對于頻繁的查詢優先考慮使用覆蓋索引。
覆蓋索引:就是包含了所有查詢字段(where,select,ordery by,group by包含的字段)的索引
覆蓋索引的好處:
避免 InnoDB 表進行索引的二次查詢
InnoDB 是以聚集索引的順序來存儲的,對于 InnoDB 來說,二級索引在葉子節點中所保存的是行的主鍵信息,如果是用二級索引查詢數據的話,在查找到相應的鍵值后,還要通過主鍵進行二次查詢才能獲取我們真實所需要的數據。而在覆蓋索引中,二級索引的鍵值中可以獲取所有的數據,避免了對主鍵的二次查詢 ,減少了 IO 操作,提升了查詢效率。
可以把隨機 IO 變成順序 IO 加快查詢效率
由于覆蓋索引是按鍵值的順序存儲的,對于 IO 密集型的范圍查找來說,對比隨機從磁盤讀取每一行的數據 IO 要少的多,因此利用覆蓋索引在訪問時也可以把磁盤的隨機讀取的 IO 轉變成索引查找的順序 IO。
九、索引 SET 規范
盡量避免使用外鍵約束。
不建議使用外鍵約束(foreign key),但一定要在表與表之間的關聯鍵上建立索引。
外鍵可用于保證數據的參照完整性,但建議在業務端實現。
外鍵會影響父表和子表的寫操作從而降低性能。
十、數據庫 SQL 開發規范
預編譯語句可以重復使用這些計劃,減少 SQL 編譯所需要的時間,還可以解決動態 SQL 所帶來的 SQL 注入的問題 只傳參數,比傳遞 SQL 語句更高效 相同語句可以一次解析,多次使用,提高處理效率。
隱式轉換會導致索引失效。如:
select name,phone from customer where id = '111';
避免使用雙 % 號的查詢條件。
如a like '%123%',(如果無前置 %,只有后置 %,是可以用到列上的索引的)
一個 SQL 只能利用到復合索引中的一列進行范圍查詢
如:有 a,b,c 列的聯合索引,在查詢條件中有 a 列的范圍查詢,則在 b,c 列上的索引將不會被用到,在定義聯合索引時,如果a列要用到范圍查找的話,就要把 a 列放到聯合索引的右側。
使用 left join 或 not exists 來優化 not in 操作
因為 not in 也通常會使用索引失效。
4. 數據庫設計時,應該要對以后擴展進行考慮
為數據庫遷移和分庫分表留出余地
降低業務耦合度
避免權限過大而產生的安全風險
6. 禁止使用 SELECT *
必須使用 SELECT <字段列表> 查詢
原因:
消耗更多的 CPU 和 IO 以網絡帶寬資源
無法使用覆蓋索引
可減少表結構變更帶來的影響
7. 禁止使用不含字段列表的 INSERT 語句
如:
insert into values ('a','b','c');
應使用:
insert into t(c1,c2,c3) values ('a','b','c');
通常子查詢在 in 子句中,且子查詢中為簡單 SQL ( 不包含 union、group by、order by、limit 從句 ) 時,才可以把子查詢轉化為關聯查詢進行優化。
子查詢性能差的原因:
子查詢的結果集無法使用索引,通常子查詢的結果集會被存儲到臨時表中,不論是內存臨時表還是磁盤臨時表都不會存在索引,所以查詢性能會受到一定的影響。
特別是對于返回結果集比較大的子查詢,其對查詢性能的影響也就越大。
由于子查詢會產生大量的臨時表也沒有索引,所以會消耗過多的 CPU 和 IO 資源,產生大量的慢查詢。
9. 避免使用 JOIN 關聯太多的表
對于 MySQL 來說,是存在關聯緩存的,緩存的大小可以由 join_buffer_size 參數進行設置。
在 MySQL 中,對于同一個 SQL 多關聯(join)一個表,就會多分配一個關聯緩存,如果在一個 SQL 中關聯的表越多,所占用的內存也就越大。
如果程序中大量的使用了多表關聯的操作,同時 join_buffer_size 設置的也不合理的情況下,就容易造成服務器內存溢出的情況,就會影響到服務器數據庫性能的穩定性。
同時對于關聯操作來說,會產生臨時表操作,影響查詢效率 MySQL 最多允許關聯 61 個表,建議不超過 5 個。
數據庫更適合處理批量操作 合并多個相同的操作到一起,可以提高處理效率
In 的值不要超過 500 個, in 操作可以更有效的利用索引,or 大多數情況下很少能利用到索引。
會把表中所有符合條件的數據裝載到內存中,然后在內存中對所有數據根據隨機生成的值進行排序,并且可能會對每一行都生成一個隨機值,如果滿足條件的數據集非常大,就會消耗大量的 CPU 和 IO 及內存資源。
推薦在程序中獲取一個隨機值,然后從數據庫中獲取數據的方式。
對列進行函數轉換或計算時會導致無法使用索引。
不推薦:
where date(create_time)='20190101'
推薦:
where create_time >= '20190101' and create_time < '20190102'
UNION 會把兩個結果集的所有數據放到臨時表中后再進行去重操作。
UNION ALL 不會再對結果集進行去重操作。
15. 拆分復雜的大 SQL 為多個小 SQL
大 SQL:邏輯上比較復雜,需要占用大量 CPU 進行計算的SQL 。
MySQL:一個 SQL 只能使用一個 CPU 進行計算。
SQL 拆分后可以通過并行執行來提高處理效率。
十一、數據庫操作行為規范
1. 超 100 萬行的批量寫(UPDATE、DELETE、INSERT)操作,要分批多次進行操作
大批量操作可能會造成嚴重的主從延遲
主從環境中,大批量操作可能會造成嚴重的主從延遲,大批量的寫操作一般都需要執行一定長的時間,而只有當主庫上執行完成后,才會在其他從庫上執行,所以會造成主庫與從庫長時間的延遲情況
Binlog 日志為 row 格式時會產生大量的日志
大批量寫操作會產生大量日志,特別是對于 row 格式二進制數據而言,由于在 row 格式中會記錄每一行數據的修改,我們一次修改的數據越多,產生的日志量也就會越多,日志的傳輸和恢復所需要的時間也就越長,這也是造成主從延遲的一個原因。
避免產生大事務操作
大批量修改數據,一定是在一個事務中進行的,這就會造成表中大批量數據進行鎖定,從而導致大量的阻塞,阻塞會對 MySQL 的性能產生非常大的影響。
特別是長時間的阻塞會占滿所有數據庫的可用連接,這會使生產環境中的其他應用無法連接到數據庫,因此一定要注意大批量寫操作要進行分批。
避免大表修改產生的主從延遲
避免在對表字段進行修改時進行鎖表
對大表數據結構的修改一定要謹慎,會造成嚴重的鎖表操作,尤其是生產環境,是不能容忍的。
pt-online-schema-change 它會首先建立一個與原表結構相同的新表,并且在新表上進行表結構的修改,然后再把原表中的數據復制到新表中,并在原表中增加一些觸發器。
把原表中新增的數據也復制到新表中,在行所有數據復制完成之后,把新表命名成原表,并把原來的表刪除掉,把原來一個 DDL 操作,分解成多個小的批次進行。
當達到最大連接數限制時,還運行 1個 有 super 權限的用戶連接 super 權限只能留給 DBA 處理問題的賬號使用。
到此,關于“MySQL規范知識有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。