一、談談你在寫sql語句須要注意有哪些點?php
答:mysql
select * 問題,客戶端須要什麼,就給什麼,不要給多餘的字段,這種狀況可能還會致使原本能夠走覆蓋索引的語句不能走覆蓋索引。laravel
不要在查詢語句字段上作函數運算,這樣會讓索引失效。面試
必定要避免mysql自動類型轉換,好比 where ‘9’ =9。redis
能不設置容許 null 的字段儘可能不要設置,由於 null 會致使 mysql 多一層判斷。算法
使用 like 的時候若是是通配符 % 在最前面的話也會走的全表掃描。sql
歡迎補充。shell
二、你剛纔一直在提索引,把你知道的關於索引的一些技巧說下數據庫
答:設計模式
要在區分度高的字段上創建索引,不然索引意義不大。
字符串創建索引要注意大小,索引長度過長,佔用的空間也就越大,適當的能夠截取進行索引,缺點是不能使用到覆蓋索引,具體根據業務合理安排。
創建聯合索引要知道最左前綴原則,舉個例子( name, email, phone ),最終能走這個聯合索引的必定只會是 ( name ),( name, email ),( name, email, phone ),其餘只能走全表,須要根據業務合理設置聯合索引的順序。
三、索引底層是什麼數據結構?
答:B+樹。
四、爲何用的是B+樹,不能使用紅黑樹或者其餘的?
答:可使用紅黑樹。可是這樣的話可能會形成樹的高度太高,意味着相同查詢下,會進行更多的磁盤I/O,影響性能,而 B+ 樹能夠保持樹的高度不至於太高。這道題答得不是很好,不只僅是這樣,歡迎補充。
五、你知道索引下推嗎?
本質上是對普通索引須要回表的一種優化,也就是引擎層在對索引指針遍歷的過程當中,先作一些優先的判斷,過濾掉不符合條件的,能夠減小磁盤IO。
六、假設如今有人操做數據庫,不當心執行錯了語句,誤刪除了不少數據,這時候能恢復嗎?咋麼恢復。
答:首先,必定要開啓 bin-log ,若是沒有開啓的話,可能就恢復不了。要看具體的文件系統是否能恢復。開啓了 bin-log ,類型設置要設置成 row 或者 mixed ,不能設置 statement 。而後,若是是誤刪行的話,就能夠把裏面對應的刪除事件換成插入事件,在備用庫上執行。若是是誤刪表的話,能夠先獲取最近的一次全量備份,放到備庫,而後拿出 bin-log , 除了不執行刪除的事件,其餘事件依次重放。
7.爲何不能設置成 statement ?
答:設置成 statement ,實際 bin-log 存儲的是 sql 語句( 非具體刪除的主鍵id ),這樣若是是主從架構的話,主和從可能由於選擇的索引不同而致使主從不一致。
8.你剛纔說到主從,那你說說主從運行的機制吧
答:首先主庫仍是要開啓 bin-log , 從庫先設置要鏈接的主庫 change master…… 而後執行 start slave,這時候從庫會建立兩個線程,一個 io_thread ,主要負責鏈接主數據庫。一個sql_thread 主要是負責執行中轉日誌語句。首先,主庫接收到從庫的同步請求,根據傳遞的 bin-log 文件名和開始同步的位置,發送二進制文件給從庫,從庫 io_thread 負責把接收到的數據放入到中轉日誌,而後 sql_thread 負責從中轉日誌讀取解析執行,執行完成,更新同步的位置標誌。
9.你知道主從延遲嗎?有些時候延遲的時間還會很長。遇到這種狀況咋麼辦?
答:這種問題,注意了。劃重點。問你出現問題,尋找解決方案的時候,必定要對症下藥,也就是說這個問題你能夠這樣考慮,什麼狀況下致使的主從延遲。
若是主庫和從庫服務器配置不同,從庫的差點,那麼就可能致使延遲時間加長。這時候,換成相同的服務器配置服務器便可。
從庫壓力太大了。通常主從了,從庫基本用來查詢,好比可能運營或者開發者本身都在從庫上進行一系列的 sql 操做。那簡單唄。多配幾個從庫,分攤壓力,一主多從。
大事務。好比 delete 這種語句 不 limit 限制一下,若是數據量過大,致使主庫運行時都花費了長時間,再同步到從庫,這個時間間隔過長。
你知道哪些設計模式,你日常有使用到嗎?能夠結合你的業務場景說下嗎?
答:這裏我先舉例日常使用 Laravel,裏面就用到大量設計模式,好比門面,組合,裝飾,觀察者…… 具體場景帶入,而後根據以前業務上的場景說了下……., 最後也說了設計模式不是銀彈,只有在合適的場景使用合適的模式才能體現它的價值。
給定一個已排序的數組和一個指定值,返回指定值在數組中的下標位置,若是不存在,返回把給定值插入到數組以後的下標位置。注意時間複雜度。
好比給定有序數組 [1,3,5,6] 給定值5.那麼返回下標2.
給定有序數組[1,3,5,6] 給定值 7,返回下標4.
答:
function searchInsert($nums, $target) { if (!count($nums)) return 0; $l=0; $r = count($nums)-1; while ($l <= $r){ $middle = $l + (($r - $l) >> 1); if ($nums[$middle] == $target) return $middle; if ($nums[$middle] < $target){ $l = $middle+1; }else{ $r = $middle-1; } } return $l; }
典型的可使用二分,時間複雜度 O(log2n)。空間複雜度O(1)。
一、傳輸層主要有哪些協議?
答:主要有 TCP 和 UDP 協議。他們的區別是 TCP 是須要鏈接的 會通過三次握手,並且能夠保證消息的可靠性。UDP 是不須要鏈接的,不保證消息的可靠性。
二、你能大致說說 TCP 的三次握手嗎?
答:首先服務器監聽某個端口,客戶端發起請求 攜帶syn數據包(第一次),服務端接收到這個數據包,返回 syn/ack 的數據包給客戶端(第二次),最後客戶端再次發送一個 ack 的數據包(第三次)。
三、爲何須要三次握手?
答:主要是爲了確認雙方接收是否正常。
第一次:客戶端什麼都不能確認。服務端能確認客戶端的發送正常,本身的接收正常
第二次:客戶端能確認本身的發送和接收正常,服務端的發送和接收正常。服務端能確認本身接收正常,客戶端的發送正常。
第三次:所有都能確認了。
假設如今有多個入口能夠同時使用一個帳戶操做,這個帳戶只有十塊錢,有哪些方法可使得不超扣消費?開放性題目,只要能解決問題的就是好方案,沒有惟一答案。
答:mysql:能夠直接 where amount>=current_amount and amount>0 …… , 或者悲觀鎖 for update。redis:lua 腳本。php 層面能夠利用文件鎖,還可使用隊列的特性,只有一個消費的出口。
若是咱們公司有不少項目都有登陸的功能,咋麼設計?
答:須要把這個登陸單獨抽出來做爲一個模塊開發,相似於登陸中心,全部的其餘子系統登陸都須要從這個系統中認證。
一、看你項目裏說到使用過swoole,也寫點go,你能夠說說他們協程上的區別嗎?
答:設計上他們是同樣的,主要區別在於,協程調度器模式。swoole 的協程調度器是單線程,go 的協程調度器是多線程。這就意味着,同一時刻 swoole 只有一個協程在運行,而 go 同一時刻能夠多個協程在運行。因此在 swoole 協程中不須要對全局變量進行加鎖。並且 swoole 本質是單線程多進程的,意味着它沒有超全局的變量,僅僅是進程級別變量。而 go 多線程,多線程必然會存在臨界變量鎖的問題。固然,go 也提供了開箱即用的 sync 讀寫鎖,或者你也能夠直接使用通道來代替。
二、你能夠說說 go 的 gmp 調度模型嗎?
答:巴拉巴拉半天,本身都以爲沒說清楚,好吧,我不是很瞭解。此時猜想面試官內心,早說不知道不就完事了嗎
三、說說大家這個項目最難的點是哪一個地方,你是咋麼解決的?
那就要看你本身對項目的掌握程度以及這個項目的含金量了。
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是人才。以前說過,PHP方面的技術點不少,也是由於太多了,實在是寫不過來,寫過來了你們也不會看的太多,因此我這裏把它整理成了PDF和文檔,若是有須要的能夠
更多學習內容能夠訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)
以上內容但願幫助到你們,不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們,須要的能夠加入個人 PHP技術交流羣