你好,是我琉憶,PHP程序員面試筆試系列圖書的做者。mysql
本週(2019.3.4至3.8)的一三五更新的文章以下:程序員
週一:PHP面試MySQL數據庫的基礎知識
週三:PHP面試MySQL數據庫的索引
週五:PHP面試MySQL數據庫的面試真題
今天週五,提早祝各位週末愉快。面試
本身整理了一篇「 什麼是數據庫三級封鎖協議?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 鎖」,我發給你。
如下內容部分來自《PHP程序員面試筆試寶典》和《PHP程序員面試筆試真題解析》如需轉載請註明出處。sql
BEGIN TRANSACTION DELETE FROM MYTABLE WHERE ID=1 DELETE FROM OTHERTABLE ROLLBACK TRANSACTION
A.OTHERTABLE 中的內容將被刪除數據庫
B.OTHERTABLE 和 MYTABLE 中的內容都會被刪除編程
C.OTHERTABLE 中的內容將被刪除,MYTABLE 中 ID 是 1 的內容將被刪除緩存
D.數據庫沒有變化服務器
參考答案:D。函數
分析:這個查詢是一個事務,而且這個事務的最後有回滾,數據庫不會有變化。性能
數據庫優化的過程可使用如下的方法進行:
1)選取最適用的字段屬性,儘量減小定義字段長度,儘可能把字段設置NOT NULL,例如'省份、性別',最好設置爲ENUM。
2)使用鏈接(JOIN)來代替子查詢。
① 刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。
② 提取全部沒有訂單客戶:
SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。
③ 提升b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo. customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL。
3)使用聯合(UNION)來代替手動建立的臨時表。建立臨時表:SELECT name FROM 'nametest' UNION SELECT username FROM 'nametest2'。
4)事務處理。保證數據完整性,例如添加和修改。同時,若是二者成立,則都執行,一者失敗都失敗:
mysql_query("BEGIN"); mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')"; mysql_query("SELECT * FROM 'orderinfo' where customerid=".$id"); mysql_query("COMMIT");
5)鎖定表,優化事務處理。用一個SELECT語句取出初始數據,經過一些計算,用UPDATE語句將新值更新到表中。包含有WRITE關鍵字的LOCK TABLE語句能夠保證在UNLOCK TABLES命令被執行以前,不會有其餘的訪問來對customerinfo表進行插入、更新或者刪除的操做。
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE"); mysql_query("SELECT customerid FROM 'customerinfo' where id=".$id); mysql_query("UPDATE 'orderinfo' SET ordertitle='$title' where customerid=".$id); mysql_query("UNLOCK TABLES");
6)使用外鍵,優化鎖定表。把customerinfo裏的customerid映射到orderinfo裏的customerid,任何一條沒有合法的customerid的記錄不會寫到orderinfo裏。
CREATE TABLE customerinfo ( customerid INT NOT NULL, PRIMARY KEY(customerid) )TYPE = INNODB; CREATE TABLE orderinfo ( orderid INT NOT NULL, customerid INT NOT NULL, PRIMARY KEY(customerid,orderid), FOREIGN KEY (customerid) REFERENCES customerinfo (customerid) ON DELETE CASCADE )TYPE = INNODB;
注意:'ON DELETE CASCADE',該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order。
表中的該用戶的全部記錄,注意使用外鍵時要定義數據庫引擎爲INNODB。
在MySQL中有兩個存儲引擎:MyISAM和InnoDB,每一個引擎都有利有弊。
MyISAM適合於一些須要大量查詢的應用,但其對於有大量寫操做的支持並非很好。甚至只是須要update一個字段,整個表都會被鎖起來,而其餘進程,就算是讀進程都沒法操做直到讀操做完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。
InnoDB 的趨勢會是一個很是複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。可是它支持「行鎖」,因而在寫操做比較多的時候,會更優秀。而且,它還支持更多的高級應用,例如事務。
參考答案:檢查PHP腳本的執行效率的方法以下:能夠在檢查的代碼開頭記錄一個時間,而後在代碼的結尾也記錄一個時間,結尾時間減去開頭時間取這個時間的差值,從而檢查PHP的腳本執行效率,記錄時間可使用microtime()函數。
檢查數據庫SQL的效率的方法以下:能夠經過explain顯示MySQL如何使用索引來處理select語句及鏈接表,幫助選擇更好的索引和寫出更優化的查詢語句。而後啓用slow query log記錄慢查詢,經過查看SQL的執行時間和效率來定位分析腳本執行的問題和瓶頸所在。
本身整理了一篇「 什麼是數據庫三級封鎖協議?」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 鎖」,我發給你。
A.使用索引能加快插入數據的速度
B.良好的索引策略有助於防止跨站攻擊
C.應當根據數據庫的實際應用合理設計索引
D.刪除一條記錄將致使整個表的索引被破壞
參考答案:C。
分析:索引的做用主要是幫助數據庫快速查找到對應的數據,並不能加快插入數據的速度,因此,選項A錯誤。
索引不可以幫助防止跨站攻擊,因此,選項B錯誤。
建立合理的索引須要分析數據庫的實際用途並找出它的弱點。優化腳本中的冗餘查詢一樣也能提升數據庫效率。索引是佔用物理空間的,因此在實際的應用中是要合理設計使用索引的。因此,選項C正確。
索引是一種表結構,刪除一條數據也不會影響到整個表的索引,而且索引不必定是數字,也能夠是字符串。因此,選項D錯誤。
A.Sphinx是一個基於SQL的全文檢索引擎,能夠結合MySQL作全文搜索,它能夠提供比數據庫自己更專業的搜索功能
B.Solr是新一代的全文檢索組件,它比Lucene的搜索效率高不少,還能支持HTTP的訪問方式,PHP調用Solr也很方便
C.MySQL中把一個字段創建FULLTEXT索引,就能夠實現全文檢索,目前MyISAM和InnoDB的table都支持FULLTEXT索引
D.Lucene附帶的二元分詞分析器CJKAnalyzer切詞速度很快,能知足通常的全文檢索須要
參考答案:B。
分析:Sphinx是一個基於SQL的全文檢索引擎,能夠結合MySQL、PostgreSQL作全文搜索,它能夠提供比數據庫自己更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。
Solr是一個獨立的企業級搜索應用服務器,用戶能夠經過HTTP請求訪問,它是採用JAVA5開發,基於Lucene的全文搜索服務器,同時對其進行了擴展,提供了比Lucene更爲豐富的查詢語言,同時實現了可配置、可擴展並對查詢性能進行了優化,而且提供了一個完善的功能管理界面,是一款很是優秀的全文搜索引擎。而且Solr比Lucene的搜索效率高不少,可是PHP調用Solr並不方便,選項B的說法錯誤。
MySQL中的MyISAM和InnoDB都是支持FULLTEXT全文索引的。全文搜索引擎能夠在不使用模板匹配操做的狀況下查找單詞或短語。
SELECT * FROM MY_TABLE
A.若是可能,那麼把查詢轉換成存儲例程
B.若是程序容許,那麼給查詢指定返回記錄的範圍
C.若是可能,那麼添加 where 條件
D.若是DBMS容許,那麼把查詢轉換成視圖
參考答案:B、C。
分析:有兩個方法能限制返回記錄的條數——使用 where 條件或limit關鍵字指定查詢返回的記錄的範圍。
一般狀況下,若是沒有特殊須要,那麼儘可能不要用 select *,這會浪費大量的數據緩存。
以上內容摘自《PHP程序員面試筆試寶典》和《PHP程序員面試筆試真題解析》書籍,目前本書沒有電子版,可到各大電商平臺購買紙質版。
更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫
對本文有什麼問題或建議均可以進行留言,我將不斷完善追求極致,感謝大家的支持。