Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

?
Lv 6
? 發問於 電腦與網際網路程式設計 · 7 年前

連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 個解答

評分
  • water
    Lv 5
    7 年前
    最愛解答

    雖然我對這方面也不是很專精

    但是以我自己的了解來說~

    一般規模較小的公司會把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/)
  • 7 年前

    如果資料表不大,且只用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 4
    7 年前

    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 6
    7 年前

    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.

還有問題嗎?立即提問即可得到解答。