MySQL中有哪些重要的日志文件?
錯誤日志:
記錄MySQL服務(wù)器運行過程中的錯誤信息。
查詢?nèi)罩荆℅eneral Log):
記錄數(shù)據(jù)庫執(zhí)行的所有命令。
慢查詢?nèi)罩荆?/h2>
記錄執(zhí)行時間超過預(yù)設(shè)閾值的查詢語句。
redo log(重做日志):
用于在系統(tǒng)崩潰時恢復(fù)未提交的數(shù)據(jù)。
undo log(回滾日志):
用于事務(wù)回滾時恢復(fù)數(shù)據(jù)。
bin log(二進(jìn)制日志):
記錄所有數(shù)據(jù)庫表結(jié)構(gòu)變更和數(shù)據(jù)修改操作,用于復(fù)制和數(shù)據(jù)恢復(fù)。
redo log和binlog的區(qū)別是什么?
redo log:
主要用于MySQL異常重啟后的一種數(shù)據(jù)恢復(fù)手段,確保了數(shù)據(jù)的一致性。它是循環(huán)寫的,記錄邏輯操作(如頁修改的物理邏輯),用于崩潰恢復(fù)時重放未持久化的操作。
binlog:
記錄了所有數(shù)據(jù)庫表結(jié)構(gòu)變更和數(shù)據(jù)修改操作,是追加寫的,保存的是全量的日志。它主要用于復(fù)制、數(shù)據(jù)恢復(fù)和審計。
SQL注入是什么,如何防范?
SQL注入是一種攻擊方式,允許攻擊者通過網(wǎng)站輸入SQL語句,可能破壞整個數(shù)據(jù)庫或提取敏感信息。通過使用預(yù)處理語句與參數(shù)化查詢、輸入驗證和轉(zhuǎn)義特殊字符來防范。
1.(簡單又有效的方法)PreparedStatement
采用預(yù)編譯語句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。
使用好處:
(1).代碼的可讀性和可維護(hù)性.
(2).PreparedStatement盡最大可能提高性能.
(3).最重要的一點是極大地提高了安全性.
2.對用戶輸入進(jìn)行嚴(yán)格的格式校驗和過濾
3.前后端分離架構(gòu),在后端API層統(tǒng)一校驗
下面是在開發(fā)過程中可以防范SQL 注入的一些方法:
1.避免使用動態(tài)SQL 避免將用戶的輸入數(shù)據(jù)直接放入 SQL 語句中,最好使用準(zhǔn)備好的語句和參數(shù)化查詢,這樣更安全。
2.不要將敏感數(shù)據(jù)保留在純文本中 加密存儲在數(shù)據(jù)庫中的私有/機密數(shù)據(jù),這樣可以提供了另一級保護(hù),以防攻擊者成功地排出敏感數(shù)據(jù)。
3.限制數(shù)據(jù)庫權(quán)限和特權(quán) 將數(shù)據(jù)庫用戶的功能設(shè)置為最低要求;這將限制攻擊者在設(shè)法獲取訪問權(quán)限時可以執(zhí)行的操作。
4.避免直接向用戶顯示數(shù)據(jù)庫錯誤 攻擊者可以使用這些錯誤消息來獲取有關(guān)數(shù)據(jù)庫的信息。
MySQL用戶管理的最佳實踐是什么?
包括最小權(quán)限原則、定期審查用戶權(quán)限、強化密碼和禁止使用根賬戶進(jìn)行功能操作。
如何使用EXPLAIN分析sql語句的性能?
1)、id列數(shù)字越大越先執(zhí)行,如果說數(shù)字一樣大,那么就從上往下依次執(zhí)行,id列為null的就表是這是一個結(jié)果集,不需要使用它來進(jìn)行查詢。
2)、select_type列常見的有:SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION、UNION RESULT、DEPENDENT UNION、DEPENDENT UNION。
3)、table
顯示的查詢表名,如果查詢使用了別名,那么這里顯示的是別名,如果不涉及對數(shù)據(jù)表的操作,那么這顯示為null
4)、type
依次從好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一個索引
A:system:表中只有一行數(shù)據(jù)或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在這個情況通常都是all或者index
B:const:使用唯一索引或者主鍵,返回記錄一定是1行記錄的等值where條件時,通常type是const。其他數(shù)據(jù)庫也叫做唯一索引掃描
C:eq_ref:出現(xiàn)在要連接過個表的查詢計劃中,驅(qū)動表只返回一行數(shù)據(jù),且這行數(shù)據(jù)是第二個表的主鍵或者唯一索引,且必須為not null,唯一索引和主鍵是多列時,只有所有的列都用作比較時才會出現(xiàn)eq_ref
D:ref:不像eq_ref那樣要求連接順序,也沒有主鍵和唯一索引的要求,只要使用相等條件檢索時就可能出現(xiàn),常見與輔助索引的等值查找?;蛘叨嗔兄麈I、唯一索引中,使用第一個列之外的列作為等值查找也會出現(xiàn),總之,返回數(shù)據(jù)不唯一的等值查找就可能出現(xiàn)。
E:fulltext:全文索引檢索,要注意,全文索引的優(yōu)先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優(yōu)先選擇使用全文索引
F:ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多。
G:unique_subquery:用于where中的in形式子查詢,子查詢返回不重復(fù)值唯一值
H:index_subquery:用于in形式子查詢使用到了輔助索引或者in常數(shù)列表,子查詢可能返回重復(fù)值,可以使用索引將子查詢?nèi)ブ亍?/p>
I:range:索引范圍掃描,常見于使用>,
J:index_merge:表示查詢使用了兩個以上的索引,最后取交集或者并集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之后,但是實際上由于要讀取所個索引,性能可能大部分時間都不如range
K:index:索引全表掃描,把索引從頭到尾掃一遍,常見于使用索引列就可以處理不需要讀取數(shù)據(jù)文件的查詢、可以使用索引排序或者分組的查詢。
L:all:這個就是全表掃描數(shù)據(jù)文件,然后再在server層進(jìn)行過濾返回符合要求的記錄。
5)、possible_keys
查詢可能使用到的索引都會在這里列出來
6)、key
查詢真正使用到的索引
7)、key_len
用于處理查詢的索引長度
8)、ref
如果是使用的常數(shù)等值查詢,這里會顯示const,如果是連接查詢,被驅(qū)動表的執(zhí)行計劃這里會顯示驅(qū)動表的關(guān)聯(lián)字段,如果是條件使用了表達(dá)式或者函數(shù),或者條件列發(fā)生了內(nèi)部隱式轉(zhuǎn)換,這里可能顯示為func
9)、rows
這里是執(zhí)行計劃中估算的掃描行數(shù),不是精確值
10)、extra
MySQL服務(wù)器的默認(rèn)端口是什么?
3306
三大范式是什么?
第一范式要求每列都是不可再分的原子數(shù)據(jù)項
第二范式要求非主鍵字段完全依賴于主鍵
第三范式要求非主鍵字段之間不存在傳遞依賴。
日常工作中應(yīng)該怎么優(yōu)化SQL?
1.優(yōu)化表結(jié)構(gòu)
1.1盡量使用數(shù)字型字段
若只含數(shù)值信息的字段盡量不要設(shè)計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。
1.2盡可能的使用 varchar 代替 char
變長字段存儲空間小,可以節(jié)省存儲空間。
1.3當(dāng)索引列大量重復(fù)數(shù)據(jù)時,可以把索引刪除掉
2.優(yōu)化查詢
應(yīng)盡量避免在 where 子句中使用!=或<>操作符
應(yīng)盡量避免在 where 子句中使用 or 來連接條件
任何查詢也不要出現(xiàn)select *
避免在 where 子句中對字段進(jìn)行 null 值判斷
3.索引優(yōu)化
對作為查詢條件和 order by的字段建立索引
避免建立過多的索引,多使用組合索引
對慢sql如何優(yōu)化?
分析語句,是否加載了不必要的字段/數(shù)據(jù)
分析 SQL 執(zhí)行句話,是否命中索引等
如果 SQL 很復(fù)雜,優(yōu)化 SQL 結(jié)構(gòu)
如果表數(shù)據(jù)量太大,考慮分表
InnoDB中的B+Tree特性帶來的優(yōu)勢?
它是B Tree的變種,B Tree能解決的問題它都能解決,B+Tree能解決的兩大問題(1. 減少樹高度提升檢索效率 2. 節(jié)點存儲更多鍵值降低I/O次數(shù))
掃庫、掃表的能力更強(如果我們要進(jìn)行全表掃描,只需要遍歷葉子節(jié)點就可以了,不需要遍歷整個B+Tree拿到所有的數(shù)據(jù))
B+Tree的磁盤讀寫能力相對B Tree來說更強(根節(jié)點和枝節(jié)節(jié)點不保存數(shù)據(jù)區(qū),所以一個節(jié)點可以保存更多關(guān)鍵字,一次磁盤加載的關(guān)鍵字更多)
排序能力更強(因為葉子節(jié)點上有下一個數(shù)據(jù)區(qū)的指針,數(shù)據(jù)形成了鏈表)
效率更加穩(wěn)定(B+Tree永遠(yuǎn)是在葉子節(jié)點拿到數(shù)據(jù),所以IO次數(shù)穩(wěn)定)