[精選]Mysql優(yōu)化查詢過程中的數(shù)據(jù)訪問
1.TCP/IP協(xié)議中ARP及RARP協(xié)議的作用?
ARP協(xié)議的作用是由IP地址查找對應(yīng)的MAC地址
RARP協(xié)議的作用正好相反,是由MAC地址查找對應(yīng)的IP地址。
2. 重放攻擊,Smurf攻擊,字典攻擊,中間人攻擊
重放攻擊指攻擊者發(fā)送一個目的主機(jī)已接收過的包,來達(dá)到欺騙系統(tǒng)的目的,主要用于身份認(rèn)證過程,破壞認(rèn)證的正確性。重放攻擊可以由發(fā)起者,也可以由攔截并重發(fā)該數(shù)據(jù)的地方進(jìn)行。
Smurf攻擊是一種分布式拒絕服務(wù) (DDoS) 攻擊,結(jié)合使用IP欺騙和ICMP回復(fù)方法使大量網(wǎng)絡(luò)傳輸充斥目標(biāo)系統(tǒng),引起目標(biāo)系統(tǒng)拒絕為正常系統(tǒng)進(jìn)行服務(wù)。Smurf攻擊通過使用將回復(fù)地址設(shè)置成網(wǎng)絡(luò)的廣播地址的ICMP應(yīng)答請求數(shù)據(jù)包,來淹沒受害主機(jī),最終導(dǎo)致該網(wǎng)絡(luò)的所有主機(jī)都對此ICMP應(yīng)答請求做出回復(fù),導(dǎo)致網(wǎng)絡(luò)阻塞。更復(fù)雜的將源地址改為第三方的受害者,最終導(dǎo)致第三方崩潰。
字典攻擊是在破解密碼或密鑰時,逐一嘗試用戶自定義詞典中的可能密碼的攻擊方式。與暴力破解的區(qū)別是,暴力破解會逐一嘗試所有可能的組合密碼,而字典攻擊會使用一個預(yù)先定義好的單詞列表。
中間人攻擊是一種間接的入侵攻擊,這種攻擊模式是通過各種技術(shù)手段將受入侵者控制的一臺計算機(jī)虛擬放置在網(wǎng)絡(luò)連接中的兩臺通信計算機(jī)之間,這臺計算機(jī)稱為“中間人”。通過攔截正常的網(wǎng)絡(luò)通信數(shù)據(jù),并進(jìn)行數(shù)據(jù)篡改和嗅探,而通信的雙方毫不知情。
3.EXT3,EXT4,XFS文件系統(tǒng)大???
Linux | 文件系統(tǒng)大小 | 單個文件大小 |
---|---|---|
ext3 | 16TB | 2TB |
ext4 | 1EB | 16TB |
xfs | 18EB | 9EB |
4.Linux 系統(tǒng)文件描述符:
0:STDIN 標(biāo)準(zhǔn)輸入
1:STDOUT 標(biāo)準(zhǔn)輸出
2:STDERR 標(biāo)準(zhǔn)錯誤輸出
5.Mysql日志
有多少種日志 :redo/undo
日志的存放形式
redo:在頁修改的時候,先寫到redo log buffer 里面,然后寫到redo log 的文件系統(tǒng)緩存里面(fwrite),然后再同步到磁盤文件(fsync)。
Undo:在MySQL5.5之前,undo只能存放在ibdata*文件里面,5.6之后,可以通過設(shè)置innodb\_undo\_tablespaces參數(shù)把undo log存放在ibdata*之外。
事務(wù)是如何通過日志來實(shí)現(xiàn)的:
因為事務(wù)在修改頁時,要先記undo,在記undo之前要記undo的redo,然后修改數(shù)據(jù)頁,再記數(shù)據(jù)頁修改的redo。Redo(里面包括undo的修改)一定要比數(shù)據(jù)頁先持久化到磁盤。當(dāng)事務(wù)需要回滾時,因為有undo,可以把數(shù)據(jù)頁回滾到前鏡像的狀態(tài),崩潰恢復(fù)時,如果redo log中事務(wù)沒有對應(yīng)的commit記錄,那么需要用undo把該事務(wù)的修改回滾到事務(wù)開始之前。如果有commit記錄,就用redo前滾到該事務(wù)完成時并提交掉。
必須了解的MySQL三大日志:binlog、redo log和undo log
MySQL日志15連問
MySQL基于日志還原數(shù)據(jù)
6. Mysql json類型
5.7.8開始,mysql開始支持json數(shù)據(jù)類型,json數(shù)據(jù)類型存儲時會做格式檢驗,不滿足json格式會報錯,json數(shù)據(jù)類型默認(rèn)值不允許為空。
優(yōu)勢:
存儲上類似text,可以存非常大的數(shù)據(jù)。
JSON有效性檢查:插入的數(shù)據(jù)必須是JSON類型的字符串才行。
相比于傳統(tǒng)形式,不需要遍歷所有字符串才能找到數(shù)據(jù)。
支持索引:通過虛擬列的功能可以對JSON中部分的數(shù)據(jù)進(jìn)行索引
7. Mysql索引創(chuàng)建原則
最適合索引的列是出現(xiàn)在 where 子句或連接子句中的列,而不是出現(xiàn)在 select 的關(guān)鍵字后的列
索引列的基數(shù)越大,索引效果越好
對字符串進(jìn)行索引,應(yīng)指定一個前綴長度,可以節(jié)省大量的索引空間
根據(jù)情況創(chuàng)建復(fù)合索引,復(fù)合索引可以提高查詢效率
避免創(chuàng)建過多索引,索引會額外占用磁盤空間,減低寫操作效率
主鍵盡可能選擇較短的數(shù)據(jù)類型,可以有效減少索引的磁盤占用,提高效率
8. 索引的注意事項
復(fù)合索引遵循左前綴原則
like 查詢,%不能在前,可以使用全文索引
column is null 可以使用索引
如果 MySQL 估計使用索引比全表掃描更慢,會放棄使用索引
9.查詢速度慢的原因
打開慢查詢?nèi)罩?,通過 pt-query-dugest 分析
#看一下當(dāng)前mysql數(shù)據(jù)庫是否開啟了慢查詢
show variables like 'slow_query%';
#臨時開啟
set global slow_query_log='ON';
#永久開啟:修改配置文件my.cnf,在[mysqld]下的下方加入,重啟mysql服務(wù)
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/lib/mysql/tmp_slow.log //linux
long_query_time = 1
show profile,通過 set profiling=1;開啟,服務(wù)器上執(zhí)行的所有語句消耗時間都會記錄到臨時表。show profile for query QUERY_ID 查詢指定查詢
show status,查詢一些計數(shù)器,猜出哪些代價高或消耗時間多
show processlist,查詢線程狀態(tài)進(jìn)行分析
explain,分析單個 SQL 語句查詢
10.Mysql優(yōu)化查詢過程中的數(shù)據(jù)訪問
訪問數(shù)據(jù)太多導(dǎo)致性能下降
確定應(yīng)用程序是否檢索大量超過需要的數(shù)據(jù),可能是太多列或者行
確定 mysql 是否分析大量不必要的數(shù)據(jù)行
查詢不需要的記錄,使用 limit 限制
奪標(biāo)關(guān)聯(lián)返回全部列指定 A.id,A.name
總數(shù)取出全部列,select * 會讓優(yōu)化器無法完成所有覆蓋掃碼的優(yōu)化
重復(fù)查詢相同的數(shù)據(jù),可以緩存數(shù)據(jù)
改變數(shù)據(jù)庫和表的結(jié)構(gòu),修改數(shù)據(jù)表范式
重寫 SQL 語句,讓優(yōu)化器可以更優(yōu)的執(zhí)行
11.優(yōu)化長難的查詢語句
MySQL 內(nèi)部每秒能掃描內(nèi)存中上百萬行數(shù)據(jù),相比之下,響應(yīng)數(shù)據(jù)給客戶端就要慢得多
將一個大的查詢分解為多個小的查詢
分解關(guān)聯(lián)查詢,將一個關(guān)聯(lián)查詢分解為多個 sql 來執(zhí)行,讓緩存效率更高,執(zhí)行單個查詢可以減少鎖的競爭,在應(yīng)用層做關(guān)聯(lián)可以更容易對數(shù)據(jù)庫進(jìn)行拆分,查詢效率會有大幅提升,較少冗余記錄的查詢
12 .優(yōu)化特定類型的查詢語句
優(yōu)化 count()查詢,count(*)會忽略所有列,直接統(tǒng)計所有列數(shù),因此不要用 count(列名)
優(yōu)化關(guān)聯(lián)查詢,確定 ON 或者 USING 子句的列上有索引;確保 GROUP BY 和 ORDER BY 中只有一個表的列,這樣 MySQL 才有可能使用索引
優(yōu)化子查詢,可使用關(guān)聯(lián)查詢替代
優(yōu)化 GROUP BY 和 DISTINCT,建立索引進(jìn)行優(yōu)化
優(yōu)化 LIMIT 分頁,可以通過記錄上次查詢的最大 ID,如果根據(jù) id 排序時,下次查詢根據(jù)該 ID 來查 詢(如:ID > maxID)
優(yōu)化 UNION 查詢,UNION ALL 性能比 UNION 高
13.高并發(fā)常見單位
QPS:每秒鐘請求或查詢數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域指每秒響應(yīng)的請求數(shù)(指 HTTP 請求)
吞吐量:單位時間內(nèi)處理的請求數(shù)量(通常由 QPS 和并發(fā)數(shù)決定)
響應(yīng)時間:從請求發(fā)出到收到響應(yīng)花費(fèi)時間
PV:綜合瀏覽量(Page View),即頁面瀏覽量或者點(diǎn)擊量,一個訪客在 24 小時內(nèi)訪問的頁面數(shù)量。同一個人瀏覽你的網(wǎng)站同一個頁面,只記作一次 PV
UV:獨(dú)立訪客(UniQue Visitor),即一定時間范圍內(nèi)相同訪客多次訪問網(wǎng)站,只能計算為 1 個獨(dú)立訪客
帶寬:計算帶寬大小需關(guān)注兩個指標(biāo),峰值流量和頁面的平均大小
日網(wǎng)站帶寬=PV/統(tǒng)計時間(秒)平均頁面大?。↘B)8
峰值一般是平均值的倍數(shù)
QPS 不等于并發(fā)并發(fā)連接數(shù)。QPS 是每秒 HTTP 請求數(shù)量,并發(fā)連接數(shù)是系統(tǒng)同時處理的請求數(shù)量
二八定律(80%的訪問量集中在 20%的時間):(總 PV 數(shù) 80%)/(6 小時秒速 20%)=峰值每秒請求數(shù)(QPS)
壓力測試:能承受最大的并發(fā)數(shù)和最大承受的 QPS 值
14.常用性能測試工具 ab
# 模擬并發(fā)請求 100 次,總請求 5000 次
ab -c 100 -n 5000 http://example.com
15.http 狀態(tài)碼
200 請求成功2. 204 not content
206 reset content
301 永久重定向
302 臨時重定向
307 臨時重定向
400 錯誤請求
401 缺少認(rèn)證信息
403 拒絕
404 不存在
500 服務(wù)器異常
502 Bad Gateway
503 服務(wù)器超負(fù)載或停機(jī)維護(hù)
16.OSI 七層協(xié)議
物數(shù)網(wǎng)傳會表應(yīng)
物理層:建立、維護(hù)、斷開物理連接
數(shù)據(jù)鏈路層:建立邏輯連接,進(jìn)行硬件地址尋址,差錯校驗等功能
網(wǎng)絡(luò)層:進(jìn)行邏輯地址尋址,不同網(wǎng)絡(luò)之間的路徑選擇
傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口號,一級流控和差錯校驗。協(xié)議有 TCP/UDP,數(shù)據(jù)包一旦離開網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層
會話層:建立、管理、終止會話
表示層:數(shù)據(jù)的表示、安全、壓縮
應(yīng)用層:網(wǎng)絡(luò)服務(wù)與用戶的 接口,默認(rèn)協(xié)議有 :http(80),ftp(21),tftp,smtp(25),snmp,dns(53),telnet(23),https(443),pop3(110),dhcp
【面試】50道經(jīng)典計算機(jī)網(wǎng)絡(luò)面試題
面試中常見的計算機(jī)網(wǎng)絡(luò)的問題
17. HTTP 協(xié)議常見請求頭/響應(yīng)頭
Content-Type 指定數(shù)據(jù)內(nèi)容類型
Accept 指定客戶端能接受數(shù)據(jù)內(nèi)容類型
Origin 最初請求來源(POST)
Cookie
Cache-Control 指定請求的緩存機(jī)制
User-Agent 用戶瀏覽器信息
Referrer 上級請求路徑
X-Forwarded-For 請求端真實(shí) ip
Access-Control-Allow-Origin 允許其他請求域名,用于跨域
Last-Modified 最后響應(yīng)時間
18.算法,邏輯結(jié)構(gòu),存儲結(jié)構(gòu)的關(guān)系
一個算法的設(shè)計取決于所選定的邏輯結(jié)構(gòu),而算法的實(shí)現(xiàn)依賴于所采用的存儲結(jié)構(gòu)。
順序存儲結(jié)構(gòu):用數(shù)據(jù)元素在存儲器中的相對位置來表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系)。
鏈?zhǔn)酱鎯Y(jié)構(gòu):在每一個數(shù)據(jù)元素中增加一個存放另一個元素地址的指針(pointer ),用該指針來表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系)
19.PHP偽類型
偽類型:假類型,實(shí)際上在PHP中不存在的類型。但是通過偽類型可以幫助程序員去更好的查看操作手冊從而更方便學(xué)習(xí)。
mixed混合類型:多種PHP中的數(shù)據(jù)類型
number數(shù)字類型:任意數(shù)值類型(整形和浮點(diǎn)型)
callback回調(diào)類型:回調(diào)函數(shù)作為參數(shù)
20.PHP-FPM的運(yùn)行方式及優(yōu)缺點(diǎn)?
static :表示在 php-fpm 運(yùn)行時直接 fork 出 pm.max_chindren 個子進(jìn)程,
dynamic:表示,運(yùn)行時 fork 出 start_servers 個進(jìn)程,隨著負(fù)載的情況,動態(tài)的調(diào)整,最多不超過 max_children 個進(jìn)程。
一般推薦用 static ,優(yōu)點(diǎn)是不用動態(tài)的判斷負(fù)載情況,提升性能;缺點(diǎn)是多占用些系統(tǒng)內(nèi)存資源。
N 是 CPU 內(nèi)核數(shù)量,M 是 PHP 能利用的內(nèi)存數(shù)量,m 是每個 PHP 進(jìn)程平均使用的內(nèi)存數(shù)量
dynamic 方式的公式:在 N + 20% 和 M / m 之間
static方式的公式:M / (m 1.2)
pm.max_requests:指的是每個子進(jìn)程在處理了多少個請求數(shù)量之后就重啟。這個參數(shù),理論上可以隨便設(shè)置,但是為了預(yù)防內(nèi)存泄漏的風(fēng)險,還是設(shè)置一個合理的數(shù)比較好。
21.PHP常用信息函數(shù)
phpinfo — 輸出關(guān)于 PHP 配置的信息
phpversion — 獲取當(dāng)前的PHP版本
php_sapi_name — 返回 web 服務(wù)器和 PHP 之間的接口類型
ini_get — 獲取一個配置選項的值
ini_get_all — 獲取所有配置選項
ini_restore — 恢復(fù)配置選項的值
ini_set — 為一個配置選項設(shè)置值
22.PHP的socket
Socket 是在應(yīng)用層和傳輸層之間的一個抽象層,它把 TCP/IP 層復(fù)雜的操作抽象為幾個簡單的接口,供應(yīng)用層調(diào)用實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中的通信。
客戶端過程:創(chuàng)建 Socket,連接服務(wù)器,將 Socket 與遠(yuǎn)程主機(jī)連接(注意:只有 TCP 才有“連接”的概念,一些 Socket 比如 UDP、ICMP 和 ARP 沒有“連接”的概念),發(fā)送數(shù)據(jù),讀取響應(yīng)數(shù)據(jù),直到數(shù)據(jù)交換完畢,關(guān)閉連接,結(jié)束 TCP 對話。
服務(wù)端過程:先初始化 Socket,建立流式套接字,與本機(jī)地址及端口進(jìn)行綁定,然后通知 TCP,準(zhǔn)備好接收連接,調(diào)用 accept() 阻塞,等待來自客戶端的連接。如果這時客戶端與服務(wù)器建立了連接,客戶端發(fā)送數(shù)據(jù)請求,服務(wù)器接收請求并處理請求,然后把響應(yīng)數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),直到數(shù)據(jù)交換完畢。最后關(guān)閉連接,交互結(jié)束。詳述WebSocket原理
視頻 | 一步步教你操作websocket通知案例
23.PHP數(shù)組結(jié)構(gòu)及排序原理
PHP數(shù)組是由哈希表 + 雙向鏈表實(shí)現(xiàn)
排序原理:
申請n個額外空間
遍歷雙鏈表 調(diào)用排序函數(shù)zend\_qsort(內(nèi)部是快速排序算法)對數(shù)組排序
調(diào)用排序函數(shù)zend\_qsort(內(nèi)部是快速排序算法)對數(shù)組排序
排序后,雙鏈表中節(jié)點(diǎn)的位置發(fā)生變化,因而調(diào)整指定指向
遍歷數(shù)組,分別設(shè)置每一個節(jié)點(diǎn)的pListLast和pListNext
設(shè)置HashTable的pListTail
作者:碼農(nóng)編程進(jìn)階筆記
歡迎關(guān)注微信公眾號 :碼農(nóng)編程進(jìn)階筆記