“PHP學習網” 公眾號會每天分享一些面試題,正在找工作的小夥伴們可以來看看哦。
1、最佳化MYSQL資料庫的方法
(1) 選取最適用的欄位屬性,儘可能減少定義欄位長度,儘量把欄位設定NOT NULL,例如’省份,性別’,最好設定為ENUM
(2) 使用連線(JOIN)來代替子查詢:
(3) 使用聯合(UNION)來代替手動建立的臨時表
(4) 事務處理:
(5) 鎖定表,最佳化事務處理:
(6) 使用外來鍵,最佳化鎖定表
(7) 建立索引
(8) 最佳化sql語句
或者
(1).資料庫設計方面,這是DBA和Architect的責任,設計結構良好的資料庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分資料冗餘,避免JOIN操作,以提高查詢效率
(2).系統架構設計方面,表雜湊,把海量資料雜湊到幾個不同的表裡面.快慢表,快表只留最新資料,慢表是歷史存檔.叢集,主伺服器Read & write,從伺服器read only,或者N臺伺服器,各機器互為Master
(3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引
(4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連線啊,大量的Group By和order by,沒有limit等等.必要的時候,把資料庫邏輯封裝到DBMS端的儲存過程裡面.快取查詢結果,explain每一個sql語句
(5).所得皆必須,只從資料庫取必需的資料,比如查詢某篇文章的評論數,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果使用者只修改了標題,那就update … set title = ? where article_id = ?不要set content = ?(大文字)
(6).必要的時候用不同的儲存引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度
2、用PHP列印出前一天的時間格式是2020-3-18 22:21:21
$time=date(‘Y-m-d H:i:s’,strtotime(‘-1,days’))
echo $time;
3、寫一段JS程式碼來實現圖片的幻燈片形式展示。
<script>
$(function(){
//頁碼
var page=1;
//每頁顯示數
var total=4;
//點下一頁的時候執行
$('span.next').click(function(){
//透過它找到div.v_show
var $v_show=$(this).parents('div.v_show');
//透過div.v_show再找到v_content
var $v_content=$v_show.children('.v_content');
//v_content找到下面的所有的li
var $list=$v_content.children('.v_content_list');
//總條數 li.length得到總條數
var $li=$list.find('li');
var $count=Math.ceil($li.length/total);
var $width=$v_content.width();
if(page==$count){
$list.animate({left:'0px'},500);
page=1;
}else{
$list.animate({left:'-='+$width+'px'},500);
page++;
}
$('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
})
$('span.prev').click(function(){
//透過它找到div.v_show
var $v_show=$(this).parents('div.v_show');
//透過div.v_show再找到v_content
var $v_content=$v_show.children('.v_content');
//v_content找到下面的所有的li
var $list=$v_content.children('.v_content_list');
//總條數 li.length得到總條數
var $li=$list.find('li');
var $count=Math.ceil($li.length/total);
var $width=$v_content.width();
if(page==1){
$list.animate({left:'-='+(($count-1)*$width)+'px'},500);
page=4;
}else{
$list.animate({left:'+='+$width+'px'},500);
page--;
}
$('.highlight_tip span').eq(page-1).addClass('current').siblings().removeClass('current');
})
})
</script>
4、如何讓你來實現一個SNS網站的短訊息功能,簡述一下,你該如何實現.
首先建立資料表,其中欄位uid與使用者表ID相關聯,欄位sid與被髮送資訊的使用者相關聯,當傳送資訊時,將內容儲存到資料庫中,間隔一定時間查詢資料庫是否有與使用者相關連的資訊儲存,若有與使用者相關聯的資訊就遍歷輸出出來。
5、寫一個函式,算出兩個檔案的相對路徑
如:
$a=’/a/b/c/d/e.php’
$b=’/a/b/12/34/c.php’
計算出$b相對於$a的相對路徑應該是../../c/d
$na=explode('/',$a);
$nb=explode('/',$b);
$numa=count($na);
$numb=count($nb);
$max=$numa>$numb?$numa:$numb;
for($i=0;$i<$max-1;$i++){
if($na[$i]!=$nb[$i]){
$up.='../';
$path.=$na[$i]."/";
}}
echo $relpath=$up.$path;
6、請用PHP設計一個函式,對學生英語考試得分從高到低排序,輸入是所有學生的學號和考試得分,返回排好序的考試得分和對應學生的學好。考試滿分為100,由於判卷要求,得分不會有小數
要求:
1不要使用qsort等系統內建排序函式。
2請使用你認為最快最優的方式實現該函式並使排序的複雜度最低
<?php
function quickSort($arr)
{
$len = count($arr);
if($len <= 1) {
return $arr;
}
$key = $arr[0];
$left_arr = array();
$right_arr = array();
for($i=1; $i<$len; $i++){
if($arr[$i] <= $key){
$left_arr[] = $arr[$i];
} else {
$right_arr[] = $arr[$i];
}
}
$left_arr = quickSort($left_arr);
$right_arr = quickSort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
}
7、現在有一個Mysql資料庫表payment記錄使用者購買訂單,表結構如下:
TABLE payment(
id int unsigned AUTO_INCREMENT,
user_id int unsigned comment ‘使用者id’,
quantity smallint unsigned comment ‘本次購買產品數量’,
pay_time timestamp comment ‘購買時間’,
PRIMARY KEY(id)
)
使用者每訪問成功付款一筆訂單(從進入到離開),會增加一條記錄,記錄使用者的ID(user_id),以及購買的產品數量。比如:1、208,2 //208這個使用者購買2個產品
Insert into payment (user_id,quantity)values(‘***’,’***’)
1)請寫出一個SQL語句挑出使用者(id=100)最近購買的10條訂單。
Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc;
2)請寫一個SQL語句挑出使用者(id=100)最近】購買的第10到第20條訂單(共10個)
Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc limit 10,10;
3)請寫出一個SQL語句挑出購買產品數最多的10個使用者(user_id)和對應購買的產品總數。
Select use_id,sum(quantity) total,pay_time form payment group by use_id order by total desc limit 10;
8、請寫一個SQL語句。輸出購買產品數分別等於1,2,3,4,5,6,7,8,9,10的使用者數量,如果某個數量對應的使用者數為0,可以不輸出。
Select count(id) from payment where quantity in (1,2,3,4,5.6,7,8,9,10) group by quantity
最後各位可以掃下方二維碼關注我公眾號,目前我正在更新基礎面試題,之後會更新中高階、redis、liunx面試題
本作品採用《CC 協議》,轉載必須註明作者和本文連結