“PHP學習網” 公眾號會每天分享一些面試題,正在找工作的小夥伴們可以來看看哦。
一、需要設定一個有效期為31天,的memcache值,請補充下面的程式碼
<?php
$memcache_obj=new memcache
$memcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>
答案:31243600
二、請對於據select * from tableExample where ((a and b) and c or (((a and b ) and (c and d)))最佳化的語句。
答案:select * from tableExample where (a and b and c) or (a and b and c and d);
三、_____函式能返回指令碼里的任意行中呼叫的函式的名稱。該函式同時還經常被用在除錯中,用來判斷錯誤是如何發生的。
答案:debug_backtrace()
四、現在請你設計一個留言板系統,請簡要的寫出你設計的其中分頁演算法的思路.
答案:
1.可以透過count(*)來得到記錄總條數
2.將總條數除以每頁顯示條數取整得到分頁數
3.點選下一頁的連結進行傳值,將傳值拼裝成where條件
4.顯示相應資料
或者
一個簡單的資料庫的增刪改查的留言版,分頁的設計思路,即是每次進行查詢所傳送的引數不同,從資料庫中得到不同資料,在sql語句中用limit動態設定偏移量。偏移量可以透過判斷和疊加的方式而改變。而總頁數可以是,返回的總行數除以每頁顯示的條數之後取整。
如果是一個檔案寫入的留言版,則可以將取出的內容拆分成陣列,讓後設定偏移量取出不同的元素。
五、資料庫中的事務是什麼?
答:事務(transaction)是作為一個單元的一組有序的資料庫操作。如果組中的所有操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,
事務則提交,其修改將作用於所有其他資料庫程式。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。
六、最佳化MYSQL資料庫的方法。
答:
1、選取最適用的欄位屬性,儘可能減少定義欄位長度,儘量把欄位設定NOT NULL,例如’省份,性別’,最好設定為ENUM
2、使用連線(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度最佳化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL
3、使用聯合(UNION)來代替手動建立的臨時表
a.建立臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事務處理:
a.保證資料完整性,例如新增和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、鎖定表,最佳化事務處理:
a.我們用一個 SELECT 語句取出初始資料,透過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
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、使用外來鍵,最佳化鎖定表
a.把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;
7、建立索引:
a.格式:(普通索引)
建立:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([…],INDEX索引名)
(唯一索引)
建立:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([…],UNIQUE索引名)
(主鍵)
它是唯一索引,一般在建立表是建立,格式為:
CREATA TABLE tablename ([…],PRIMARY KEY[索引欄位])
8、最佳化查詢語句
a.最好在相同欄位進行比較操作,在建立好的索引欄位上儘量減少函式操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";
選取最適用的欄位屬性 儘量減少欄位的長度 設定為not null
使用join代替子查詢
使用union代替手動建立臨時表
使用並最佳化事物處理
使用外來鍵
使用索引
最佳化查詢語句
最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題
本作品採用《CC 協議》,轉載必須註明作者和本文連結