Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
連mysql下where搜尋,跑陣列依key取值哪個效率好?
最近在想有關效率的問題(到底是連資料庫比較耗效能還是陣列取key值耗?)
情況有兩種:
一、我連mysql資料庫,不下where,直接取出所有資料,然後把所有資料經過整理,處理過後的陣列再存成一個檔案,之後不再開mysql,而是直接開這檔案指定key值取資料
ex.假設我有一張商品表
name age phone
娃娃 18 09111111
機器人 20 09222222
name是唯一
取出的陣列是
array(0=>array("name"=>"娃娃","age"=>18,"phone"=>09111111),1=>array("name"=>"機器人","age"=> 20 09222222
","age"=>20,"phone"=> 09222222));
然後整理成:
array("娃娃"=>array("name"=>"娃娃","age"=>18,"phone"=>09111111),"機器人"=>array("name"=>"機器人","age"=>20 09222222
","age"=>20,"phone"=> 09222222));
把上面這個整理好的陣列存成檔案,之後要用就把這陣列從檔案提出來
下key = 機器人
就可以取出機器人的資料。
(第一次取會比較麻煩,但之後都不用在開資料庫)
-----------------------------------------------------------
第二種就是單純的用php連mysql 下where name='機器人'指令
------------------------------------------------------------
想問一下哪一個效率好?
會問這個,是因為考慮到這個資料表並不常變動,但讀取次數很大,若有1萬個人要讀,就代表要連1萬次資料庫
所以想盡量減少連線,減輕主機的負擔
想問一下這樣有沒有比較好?還是反而更耗效能??
ps.順帶一問,有沒有辦法檢查一個php執行開始到結束的時間是多久?
包含裡面要連資料庫的時間。
還有要如何檢查效能?有沒有相關軟體?
5 個解答
- waterLv 57 年前最愛解答
雖然我對這方面也不是很專精
但是以我自己的了解來說~
一般規模較小的公司會把DB Server跟AP Server用在同一台
在討論這個問題之前我們要先了解下面幾個問題
1.要用的是Web還是WinFrom程式
2.分為Client端跟Servar端
3.DB跟程式執行的地方是在Client端或是Servar端
首先我們先針對WinFrom程式來做探討一下
以我個人的了解
WinFrom一般是在Client端執行吃的是Client端的電腦資源
所以用程式將完整資料表取出在程式中做運算
我個人是認為應該是可以降低Server的使用率
但是要考慮到Client端電腦效能不優的情況下 操作起來可能會很慢
有可能造成客訴問題
接下來Web比較複雜一點
在此之前我們要先了解一下Web的運行方式
以Web來說不管你用程式(PHP、ASP...等)或是用SQL去做處理
都是使用Server的資源,所以不管你用哪種
Client數量大了都有可能造成遲緩現象
一般來說有些客戶會將程式放在AP Server、資料庫放在DB Server
來降低Server的負擔,然而另一種作法則是將資料傳遞到Client端做處理
也就是將資料庫Select出來的資料表透過JSON或其它方式
傳遞到Client端再透過JavaScrip之類的Client端程式去做處理
然而使用這種方式需要特別注意安全性的問題 以免觸犯法律
※測網站載入時間可以在GOOGLE搜尋:網頁載入時間 來做查詢
※http://sofun.tw/pingdom/ 或參考這個網址的
資料來源: 自己(http://engmeter.blogspot.tw/) - a0000778Lv 57 年前
如果資料表不大,且只用1個欄位查詢的話
我想使用方法1較快
如果使用方法2
建議使用數字做查詢
會比文字快一點
※當然,索引還是要建
執行時間追蹤
$starttime=microtime();
//實際執行的程式
$endtime=microtime();
$starttime=explode(' ',$starttime);
$endtime=explode(' ',$endtime);
echo '執行時間:'.($endtime[1]-$starttime[1]+$endtime[0]-$starttime[0]).'秒';
※這只能檢查PHP程式的執行速度,執行前的解析等需要其他的方法
- 7 年前
九卅-體育特區 官方網 http://ts777.cc/ 免費 註冊 體驗
彩球 - bingo、三星彩、四星彩、539、六合、KENO彩、威力彩等各國彩球遊戲
體育 -- 世界各國籃球(NBA)、棒球(MLB)、網球、冰球、足球等遊戲
電子 機台 -- 5PK、水果盤、7 PK、金瓶梅、趙雲救主等復古 遊戲
真人 遊戲 -- 骰寶、翻攤、龍虎、百家樂、三公、21點、輪盤等現場及手臂 遊戲
對戰 GAME -- 麻將、大老二、德州撲克、暗棋、接龍、五 子棋、鬥地主等真 人競技 遊戲
免費 加入試玩
九卅-體育網 官網 TS777。CC 免費 註冊 體驗
- ?Lv 47 年前
water的回應其實蠻詳盡的
我補充幾個想法
1.where的數值是select還是 input , 後者有可能被惡意try所以少點sql查詢一定比較安全
2.是用虛擬主機還是自己主機,資料量大不大?
一次資料是總資料表中多少比例
假設以下幾種狀況
a. 1次請求 用sql運算 抓 1%以內資料 php幾乎不用作是
b. 1次請求 用sql運算 抓 50%資料 php多少還是要做事
c. 0次請求 抓 100%資料 只用php運算
我認為關於資料運算處理查詢
理論上用sql運算理論上比用php效率略高
畢竟那是資料庫的老本行
2014-11-24 14:26:36 補充:
寫入暫存表示那些資料每次就得全部載入記憶體
可以想像應該是類似b. 的例子以上的資料量才值得寫到檔案全部讀取
例如你的網頁是個庫存系統、購物車系統
那些資料會是整個網站的全域變數 或重頭到尾都用得到
我才會考慮全部先讀取
- ?Lv 67 年前
I have ever coded program ( tcp_svr2.exe , sockthrd.exe and accessdb.exe )
,and I show the result of test.
tcp_svr2.exe can accept ipv4 and ipv6 concurrently.
database is mysql 4.0 version
-------------------------- listen port ( ipv4, ipv6)-------------------------------------
client.exe --------> tp_svr2.exe-----> sockthrd.exe --> accessDB.exe
--------------------------- 1 tcp_svr -------> 6 sockthrd ----> 3 accessDB10,000 client concurrently connect server(tcp_svr2.exe)
average speed 50 records/sec
#how many program to fork
FORK_NUMBER = 10
#fork program to run program name index start from 0PRORAM_NAME0=\src\other\tcp_svr\accessDB.exe
PRORAM_NAME1=\src\other\tcp_svr\accessDB.exe
PRORAM_NAME2=\src\other\tcp_svr\accessDB.exe
PRORAM_NAME3=\src\other\tcp_svr\tcp_svr2.exe
PRORAM_NAME4=\src\other\tcp_svr\sockthrd.exe accessDB
PRORAM_NAME5=\src\other\tcp_svr\sockthrd.exe accessDB
PRORAM_NAME6=\src\other\tcp_svr\sockthrd.exe accessDB
PRORAM_NAME7=\src\other\tcp_svr\sockthrd.exe accessDB
PRORAM_NAME8=\src\other\tcp_svr\sockthrd.exe accessDB
PRORAM_NAME9=\src\other\tcp_svr\sockthrd.exe accessDB
2014-11-22 11:38:21 補充:
use name pipe to do communicate between tcp_svr2.exe and sockthrd.exe
2014-11-22 11:40:23 補充:
use mailslot to do commuicate between sockthrd.exe and accessdb.exe
2014-11-22 11:45:29 補充:
the function of name pipe : when every client connects server ( tcp_svr2.exe), Tcp_svr3.exe creates server socket and passes it to sockthrd.exe by name pipe.
2014-11-24 16:00:24 補充:
if you have to do index( B* or R Tree ) in item of database, It can access at most 5 times IO in 1000000 records, not to load all records of table into memory.