日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

html调试模式查看data数据库,接口调试:在线sql语句查看与性能优化

發(fā)布時(shí)間:2025/7/14 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 html调试模式查看data数据库,接口调试:在线sql语句查看与性能优化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

后臺(tái)接口絕大數(shù)情況下,都需要與數(shù)據(jù)庫(kù)進(jìn)行交互,以獲取業(yè)務(wù)數(shù)據(jù)或者接收保存客戶(hù)端上報(bào)的數(shù)據(jù)。為方便后臺(tái)開(kāi)發(fā)同學(xué)進(jìn)行調(diào)試,以及實(shí)時(shí)查看全部執(zhí)行的SQL語(yǔ)句,這里簡(jiǎn)單地對(duì)全部執(zhí)行的SQL語(yǔ)句進(jìn)行調(diào)試模式下輸出。

2.13.1 開(kāi)啟SQL調(diào)試

開(kāi)啟調(diào)試模式很簡(jiǎn)單,但這里和通常的框架不一樣,我們不是全部統(tǒng)一地開(kāi)啟調(diào)試模式,因?yàn)樵诮涌谡U{(diào)用情況下返回非法的JSON會(huì)導(dǎo)致接口結(jié)果解析失敗。故我們通過(guò)添加調(diào)試參數(shù)來(lái)控制是否開(kāi)啟SQL調(diào)試。如下://$vim ./Public/init.php

//數(shù)據(jù)操作 - 基于NotORM

DI()->notorm = function(){

$debug = isset($_GET['debug']) ? true : false;

return new PhalApi_DB_NotORM(DI()->config->get('dbs'), $debug);

};特別注意: 通常,我們的調(diào)試參數(shù)不應(yīng)都簡(jiǎn)單地使用&debug=1,而是各自定義,如復(fù)雜一點(diǎn):&__phalapi_debug__=1,或者再添加一個(gè)簡(jiǎn)單的驗(yàn)簽,額外帶個(gè)參數(shù)校驗(yàn),如:&phalapisign__=202cb962ac59075b964b07152d234b70。減少暴露SQL的風(fēng)險(xiǎn)。

2.13.2 調(diào)試示例

回到前面獲取用戶(hù)基本信息接口 /demo/?service=User.GetBaseInfo 的示例。

(1)正常情況下

請(qǐng)求:http://dev.phalapi.com/demo/?service=User.GetBaseInfo&user_id=1

返回:{"ret":200,"data":{"code":0,"msg":"","info":{"id":"1","name":"dogstar","note":"oschina"}},"msg":""}

(2)帶&debug=1調(diào)試下

請(qǐng)求:http://dev.phalapi.com/demo/?service=User.GetBaseInfo&user_id=1&debug=1

返回:[1 - 0.00057s]SELECT * FROM tbl_user WHERE (id = ?); -- 1

{"ret":200,"data":{"code":0,"msg":"","info":{"id":"1","name":"dogstar","note":"oschina"}},"msg":""}

2.13.3 一個(gè)錯(cuò)誤的接口開(kāi)發(fā)

有時(shí),在進(jìn)行接口開(kāi)發(fā)時(shí),會(huì)需要進(jìn)行批量獲取的功能,如列表。但很多開(kāi)發(fā)的同學(xué)可能會(huì)因?yàn)闀r(shí)間趕或者沒(méi)有意識(shí)去對(duì)SQL查詢(xún)進(jìn)行優(yōu)化,或者甚至不知道自己的接口背后隱藏著多少問(wèn)題。下面是一個(gè)錯(cuò)誤的開(kāi)發(fā)示例。

(1)新增的批量獲取接口

假設(shè)我們?cè)陂_(kāi)發(fā)一個(gè)國(guó)際的項(xiàng)目,并且運(yùn)行良好,BOSS說(shuō)因業(yè)務(wù)需要,要加多一個(gè)接口以支持批量獲取用戶(hù)的基本信息,提供給國(guó)外某知名的社交平臺(tái)調(diào)用。

于是乎,我們很快就根據(jù)原來(lái)的單個(gè)獲取接口實(shí)現(xiàn)了新的接口://$vim ./Demo/Api/User.php

class Api_User extends PhalApi_Api{

public function getRules(){

return array(

//...

'getMultiBaseInfo' => array(

'user_ids' => array('name' => 'user_ids', 'type' => 'array', 'format' => 'explode', 'require' => true),

),

);

}

//...

public function getMultiBaseInfo(){

$rs = array('code' => 0, 'msg' => '', 'list' => array());

$domain = new Domain_User();

foreach ($this->user_ids as $userId) {

$rs['list'][] = $domain->getBaseInfo($userId);

}

return $rs;

}

}

(2)運(yùn)行調(diào)用一下

顯然,我們可以很清楚地調(diào)用新增的接口:http://dev.phalapi.com/demo/?service=User.GetMultiBaseInfo&user_ids=1,2,3

可返回:{

"ret": 200,

"data": {

"code": 0,

"msg": "",

"list": [

{

"id": "1",

"name": "dogstar",

"note": "oschina"

},

{

"id": "2",

"name": "Tom",

"note": "USA"

},

{

"id": "3",

"name": "King",

"note": "game"

}

]

},

"msg": ""

}

假設(shè)我們已經(jīng)有了這樣的數(shù)據(jù)庫(kù)表數(shù)據(jù):INSERT INTO `tbl_user` VALUES ('1', 'dogstar', 'oschina');

INSERT INTO `tbl_user` VALUES ('2', 'Tom', 'USA');

INSERT INTO `tbl_user` VALUES ('3', 'King', 'game');

(3)這樣的問(wèn)題?

這樣的問(wèn)題,在對(duì)外黑盒調(diào)用的客戶(hù)端同學(xué)是發(fā)現(xiàn)不了的,對(duì)于測(cè)試人員來(lái)說(shuō)也是無(wú)法感知的。但所犯的錯(cuò)誤也是顯然易見(jiàn)的,就是沒(méi)有進(jìn)行SQL的批量查詢(xún)優(yōu)化,造成了很多不必要的重復(fù)查詢(xún)。

這里,根據(jù)后臺(tái)接口開(kāi)發(fā)人員提供的調(diào)試參數(shù)(假設(shè)為:&debug=1),則我們可以快速發(fā)現(xiàn)存在的問(wèn)題:http://dev.phalapi.com/demo/?service=User.GetMultiBaseInfo&user_ids=1,2,3&debug=1

如下返回,我們看到了很多重復(fù)類(lèi)似的查詢(xún)語(yǔ)句。[1 - 0.0005s]SELECT * FROM tbl_user WHERE (id = ?); -- 1

[2 - 0.00042s]SELECT * FROM tbl_user WHERE (id = ?); -- 2

[3 - 0.00038s]SELECT * FROM tbl_user WHERE (id = ?); -- 3

{"ret":200,"data":{"code":0,"msg":"","list":[{"id":"1","name":"dogstar","note":"oschina"},{"id":"2","name":"Tom","note":"USA"},{"id":"3","name":"King","note":"game"}]},"msg":""}

上面輸出的調(diào)試信息,簡(jiǎn)單補(bǔ)充一個(gè)格式:[序號(hào) - 所耗時(shí)間]SQl語(yǔ)句 -- [參數(shù)1, 參數(shù)2]

(4)如何改進(jìn)?

這是一個(gè)很基本的問(wèn)題,當(dāng)然在實(shí)際項(xiàng)目中不會(huì)普通存在,這里只是作為一個(gè)示例加以說(shuō)明。但讓人失望的是,實(shí)際項(xiàng)目確實(shí)存在為數(shù)不少的這樣的情況。可能是新人的技術(shù)和意識(shí)問(wèn)題,也有可能是老同學(xué)的態(tài)度問(wèn)題。所以,優(yōu)化這么一個(gè)接口的批量SQL查詢(xún)不難,難的是如何才能讓新、老同學(xué)都注重這塊的SQL查詢(xún)優(yōu)化呢?而不是等到線上服務(wù)器異常崩潰后再來(lái)推托責(zé)任。

具體的代碼改進(jìn),留給讀者自己實(shí)踐了。畢竟,看了,實(shí)踐了,才會(huì)真正深刻地掌握。

2.13.4 由此引申這里不專(zhuān)門(mén)講述SQL的優(yōu)化,但也順便提供一些SQL查詢(xún)優(yōu)化的建議:

使用批量查詢(xún),而不是N次循環(huán)查詢(xún)!

重復(fù)的數(shù)據(jù),不要重復(fù)獲取;

根據(jù)需要,按需要獲取表字段,而不是SELECT *;

針對(duì)頻繁的搜索字段,建立必要的索引,以加快查詢(xún)速度;

使用關(guān)聯(lián)查詢(xún),而不是粗暴地類(lèi)似:where uid IN (... 這里是成千上W個(gè)用戶(hù)ID ...);

針對(duì)單條SQL語(yǔ)句執(zhí)行時(shí)間超過(guò)1秒的,重點(diǎn)優(yōu)化;

2.13.5 最后最后

奉上我們堅(jiān)持TDD開(kāi)發(fā)下的單元測(cè)試代碼:public function testGetMultiBaseInfo(){

$str = 'service=User.GetMultiBaseInfo&user_ids=1,2,3';

parse_str($str, $params);

DI()->request = new PhalApi_Request($params);

$api = new Api_User();

//自己進(jìn)行初始化

$api->init();

$rs = $api->getMultiBaseInfo();

$this->assertNotEmpty($rs);

$this->assertArrayHasKey('code', $rs);

$this->assertArrayHasKey('msg', $rs);

$this->assertArrayHasKey('list', $rs);

foreach ($rs['list'] as $item) {

$this->assertArrayHasKey('id', $item);

$this->assertArrayHasKey('name', $item);

$this->assertArrayHasKey('note', $item);

}

}

執(zhí)行單元測(cè)試的效果:dogstar@ubuntu:Tests$ phpunit --filter testGetMultiBaseInfo ./Api/Api_User_Test.php

PHPUnit 4.3.4 by Sebastian Bergmann.

.

Time: 23 ms, Memory: 6.25Mb

OK (1 test, 13 assertions)

搞定,收工,開(kāi)飯!

總結(jié)

以上是生活随笔為你收集整理的html调试模式查看data数据库,接口调试:在线sql语句查看与性能优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。