1险掀、優(yōu)化 MYSQL 數(shù)據(jù)庫(kù)的方法
(1) 選取最適用的字段屬性,盡可能減少定義字段長(zhǎng)度狸吞,盡量把字段設(shè)置 NOT NULL, 例如’省份炬灭,性別’, 最好設(shè)置為 ENUM
(2) 使用連接(JOIN)來(lái)代替子查詢:
(3) 使用聯(lián)合 (UNION) 來(lái)代替手動(dòng)創(chuàng)建的臨時(shí)表
(4) 事務(wù)處理:
(5) 鎖定表,優(yōu)化事務(wù)處理:
(6) 使用外鍵仗阅,優(yōu)化鎖定表
(7) 建立索引
(8) 優(yōu)化 sql 語(yǔ)句
或者
(1). 數(shù)據(jù)庫(kù)設(shè)計(jì)方面昌讲,這是 DBA 和 Architect 的責(zé)任,設(shè)計(jì)結(jié)構(gòu)良好的數(shù)據(jù)庫(kù)减噪,必要的時(shí)候短绸,去正規(guī)化 (英文是這個(gè):denormalize, 中文翻譯成啥我不知道), 允許部分?jǐn)?shù)據(jù)冗余,避免 JOIN 操作筹裕,以提高查詢效率
(2). 系統(tǒng)架構(gòu)設(shè)計(jì)方面醋闭,表散列,把海量數(shù)據(jù)散列到幾個(gè)不同的表里面朝卒≈ぢ撸快慢表,快表只留最新數(shù)據(jù)抗斤,慢表是歷史存檔囚企。集群,主服務(wù)器 Read & write, 從服務(wù)器 read only, 或者 N 臺(tái)服務(wù)器瑞眼,各機(jī)器互為 Master
3).(1) 和 (2) 超越 PHP Programmer 的要求了龙宏,會(huì)更好,不會(huì)沒(méi)關(guān)系伤疙。檢查有沒(méi)有少加索引
(4). 寫(xiě)高效的 SQL 語(yǔ)句银酗,看看有沒(méi)有寫(xiě)低效的 SQL 語(yǔ)句,比如生成笛卡爾積的全連接啊掩浙,大量的 Group By 和 order by, 沒(méi)有 limit 等等花吟。必要的時(shí)候,把數(shù)據(jù)庫(kù)邏輯封裝到 DBMS 端的存儲(chǔ)過(guò)程里面厨姚。緩存查詢結(jié)果,explain 每一個(gè) sql 語(yǔ)句
(5). 所得皆必須键菱,只從數(shù)據(jù)庫(kù)取必需的數(shù)據(jù)谬墙,比如查詢某篇文章的評(píng)論數(shù),select count (*) … where article_id = ? 就可以了经备,不要先 select * … where article_id = ? 然后 msql_num_rows.只傳送必須的 SQL 語(yǔ)句拭抬,比如修改文章的時(shí)候,如果用戶只修改了標(biāo)題侵蒙,那就 update … set title = ? where article_id = ? 不要 set content = ?(大文本)
(6). 必要的時(shí)候用不同的存儲(chǔ)引擎造虎。比如 InnoDB 可以減少死鎖.HEAP 可以提高一個(gè)數(shù)量級(jí)的查詢速度
2、用 PHP 打印出前一天的時(shí)間格式是 2020-3-18 22:21:21
$time=date(‘Y-m-d H:i:s’,strtotime(‘-1,days’))
echo $time;
3纷闺、寫(xiě)一段 JS 代碼來(lái)實(shí)現(xiàn)圖片的幻燈片形式展示
<script>
? ? $(function(){
? ? ? ? //頁(yè)碼
? ? ? ? var page=1;
? ? ? ? //每頁(yè)顯示數(shù)
? ? ? ? var total=4;
? ? ? ? //點(diǎn)下一頁(yè)的時(shí)候執(zhí)行
? ? ? ? $('span.next').click(function(){
? ? ? ? ? ? //通過(guò)它找到div.v_show
? ? ? ? ? ? var $v_show=$(this).parents('div.v_show');
? ? ? ? ? ? //通過(guò)div.v_show再找到v_content
? ? ? ? ? ? var $v_content=$v_show.children('.v_content');
? ? ? ? ? ? //v_content找到下面的所有的li
? ? ? ? ? ? var $list=$v_content.children('.v_content_list');
? ? ? ? ? ? //總條數(shù) li.length得到總條數(shù)
? ? ? ? ? ? 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(){
? ? ? ? ? ? //通過(guò)它找到div.v_show
? ? ? ? ? ? var $v_show=$(this).parents('div.v_show');
? ? ? ? ? ? //通過(guò)div.v_show再找到v_content
? ? ? ? ? ? var $v_content=$v_show.children('.v_content');
? ? ? ? ? ? //v_content找到下面的所有的li
? ? ? ? ? ? var $list=$v_content.children('.v_content_list');
? ? ? ? ? ? //總條數(shù) li.length得到總條數(shù)
? ? ? ? ? ? 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算凿、如何讓你來(lái)實(shí)現(xiàn)一個(gè) SNS 網(wǎng)站的短消息功能份蝴,簡(jiǎn)述一下,你該如何實(shí)現(xiàn).
首先建立數(shù)據(jù)表氓轰,其中字段 uid 與用戶表 ID 相關(guān)聯(lián)婚夫,字段 sid 與被發(fā)送信息的用戶相關(guān)聯(lián),當(dāng)發(fā)送信息時(shí)署鸡,將內(nèi)容保存到數(shù)據(jù)庫(kù)中案糙,間隔一定時(shí)間查詢數(shù)據(jù)庫(kù)是否有與用戶相關(guān)連的信息存儲(chǔ),若有與用戶相關(guān)聯(lián)的信息就遍歷輸出出來(lái)靴庆。
5时捌、寫(xiě)一個(gè)函數(shù),算出兩個(gè)文件的相對(duì)路徑
如:
$a=’/a/b/c/d/e.php’
$b=’/a/b/12/34/c.php’
計(jì)算出 $b 相對(duì)于 $a 的相對(duì)路徑應(yīng)該是../../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炉抒、請(qǐng)用 PHP 設(shè)計(jì)一個(gè)函數(shù)奢讨,對(duì)學(xué)生英語(yǔ)考試得分從高到低排序,輸入是所有學(xué)生的學(xué)號(hào)和考試得分端礼,返回排好序的考試得分和對(duì)應(yīng)學(xué)生的學(xué)好禽笑。考試滿分為 100蛤奥,由于判卷要求佳镜,得分不會(huì)有小數(shù)
要求:1 不要使用 qsort 等系統(tǒng)內(nèi)置排序函數(shù)。
2 請(qǐng)使用你認(rèn)為最快最優(yōu)的方式實(shí)現(xiàn)該函數(shù)并使排序的復(fù)雜度最低
<?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凡桥、現(xiàn)在有一個(gè) Mysql 數(shù)據(jù)庫(kù)表 payment 記錄用戶購(gòu)買訂單蟀伸,表結(jié)構(gòu)如下:
TABLE payment(
? ? id int unsigned AUTO_INCREMENT,
? ? user_id int unsigned comment ‘用戶id’,
? ? quantity smallint unsigned comment ‘本次購(gòu)買產(chǎn)品數(shù)量’,
? ? pay_time timestamp comment ‘購(gòu)買時(shí)間’,
? ? PRIMARY KEY(id)
)
用戶每訪問(wèn)成功付款一筆訂單 (從進(jìn)入到離開(kāi)), 會(huì)增加一條記錄,記錄用戶的 ID (user_id)缅刽,以及購(gòu)買的產(chǎn)品數(shù)量啊掏。比如:1、208,2 //208 這個(gè)用戶購(gòu)買 2 個(gè)產(chǎn)品
Insert into payment (user_id,quantity)values(‘***’,’***’)
1)請(qǐng)寫(xiě)出一個(gè) SQL 語(yǔ)句挑出用戶(id=100)最近購(gòu)買的 10 條訂單衰猛。
Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc;
2)請(qǐng)寫(xiě)一個(gè) SQL 語(yǔ)句挑出用戶(id=100)最近】購(gòu)買的第 10 到第 20 條訂單 (共 10 個(gè))
Select use_id,quantity,pay_time form payment where id=100 order by pay_time desc limit 10,10;
3) 請(qǐng)寫(xiě)出一個(gè) SQL 語(yǔ)句挑出購(gòu)買產(chǎn)品數(shù)最多的 10 個(gè)用戶 (user_id) 和對(duì)應(yīng)購(gòu)買的產(chǎn)品總數(shù)迟蜜。
Select use_id,sum(quantity) total,pay_time form payment group by use_id order by total desc limit 10;
8、請(qǐng)寫(xiě)一個(gè) SQL 語(yǔ)句啡省。輸出購(gòu)買產(chǎn)品數(shù)分別等于 1娜睛,2,3卦睹,4畦戒,5,6结序,7障斋,8,9,10 的用戶數(shù)量垃环,如果某個(gè)數(shù)量對(duì)應(yīng)的用戶數(shù)為 0邀层,可以不輸出。
Select count(id) from payment where quantity in (1,2,3,4,5.6,7,8,9,10) group by quantity
面試題系列:
Redis 高級(jí)面試題 學(xué)會(huì)這些還怕進(jìn)不了大廠晴裹?
面試官三年經(jīng)驗(yàn)PHP程序員知識(shí)點(diǎn)匯總
掌握 Redis這些 知識(shí)點(diǎn)被济,面試官一定覺(jué)得你很 NB
當(dāng)面試官問(wèn)你:如何進(jìn)行性能優(yōu)化?
更多學(xué)習(xí)內(nèi)容請(qǐng)?jiān)L問(wèn):
八重櫻:騰訊T3-T4標(biāo)準(zhǔn)精品PHP架構(gòu)師教程目錄大全涧团,只要你看完保證薪資上升一個(gè)臺(tái)階(持續(xù)更新)
以上內(nèi)容希望幫助到大家只磷,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問(wèn)題和瓶頸,業(yè)務(wù)代碼寫(xiě)多了沒(méi)有方向感泌绣,不知道該從那里入手去提升钮追,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)阿迈、高可擴(kuò)展元媚、高性能、高并發(fā)苗沧、服務(wù)器性能調(diào)優(yōu)刊棕、TP6,laravel待逞,YII2甥角,Redis,Swoole识樱、Swoft嗤无、Kafka、Mysql優(yōu)化怜庸、shell腳本当犯、Docker、微服務(wù)割疾、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家嚎卫,需要的可以加入我的官方群點(diǎn)擊此處。