mysql基礎(chǔ)知識(3)

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)定)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容