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