程序員找工做必備PHP基礎面試題 - 第十九天

「PHP學習網」 公衆號會天天分享一些面試題,正在找工做的小夥伴們能夠來看看哦。

1、須要設置一個有效期爲31天,的memcache值,請補充下面的代碼

<?php
$memcache_obj=new memcache
$memcache_obj->connect(‘memcache_host,11211’);
$memcache_obj->set(‘varKey’,’varValue’,0,____);
?>

答案:31243600php

2、請對於據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);

3、_____函數能返回腳本里的任意行中調用的函數的名稱。該函數同時還常常被用在調試中,用來判斷錯誤是如何發生的。

答案:debug_backtrace()mysql

4、如今請你設計一個留言板系統,請簡要的寫出你設計的其中分頁算法的思路.

答案:
1.能夠經過count(*)來獲得記錄總條數面試

2.將總條數除以每頁顯示條數取整獲得分頁數redis

3.點擊下一頁的連接進行傳值,將傳值拼裝成where條件算法

4.顯示相應數據sql

或者數據庫

一個簡單的數據庫的增刪改查的留言版,分頁的設計思路,便是每次進行查詢所發送的參數不一樣,從數據庫中獲得不一樣數據,在sql語句中用limit動態設置偏移量。偏移量能夠經過判斷和疊加的方式而改變。而總頁數能夠是,返回的總行數除以每頁顯示的條數以後取整。
若是是一個文件寫入的留言版,則能夠將取出的內容拆分紅數組,讓後設置偏移量取出不一樣的元素。數組

5、數據庫中的事務是什麼?

答:事務(transaction)是做爲一個單元的一組有序的數據庫操做。若是組中的全部操做都成功,則認爲事務成功,即便只有一個操做失敗,事務也不成功。若是全部操做完成,
事務則提交,其修改將做用於全部其餘數據庫進程。若是一個操做失敗,則事務將回滾,該事務全部操做的影響都將取消。安全

6、優化MYSQL數據庫的方法。

答:
一、選取最適用的字段屬性,儘量減小定義字段長度,儘可能把字段設置NOT NULL,例如'省份,性別',最好設置爲ENUM函數

二、使用鏈接(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

三、使用聯合(UNION)來代替手動建立的臨時表

a.建立臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`

四、事務處理:

a.保證數據完整性,例如添加和修改同時,二者成立則都執行,一者失敗都失敗

mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");

五、鎖定表,優化事務處理:

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");

六、使用外鍵,優化鎖定表

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;

七、創建索引:

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[索引字段])

八、優化查詢語句

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面試題

weixin.jpg

相關文章
相關標籤/搜索