auto_increment=效能殺手!?

edited 十月 2013 in 資料庫
小弟在網路閒逛時.無意間看到了某舖php討論區
看到一句."auto_increment 最好不要用,引響效能的大魔王之一"
不知此話怎解?
其次.把資料表內的auto_increment欄位當做PK,這樣做是正確觀念嗎?
除了進行資料關聯操作時,join..on寫起來麻煩外.
是否還有其它更難處理的麻煩?

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=4260

評論

  • edited 六月 2009
    有找到一篇文章:
    http://optimmysql.blogspot.com/2007/07/autoincrement-in-innodb.html

    不過他提到的問題是在同時且大量的 INSERT 操作時可能因為欄位( 在innodb )或資料表( 在 myisam )的 LOCK 而出現效能的延遲,通常有這樣的需求出現時,也許就會考慮用 uuid 當作 primary key ,然後增加主機數量。

    auto_increment 沒那麼糟,至少大部分的應用還沒有能力讓它看起來很糟 ;)
  • edited 七月 2009
    確實是在insert的時候會因資料表鎖定而造成排隊問題
    下面做了一些簡單測試(insert50000筆)
    測試環境:
    OS:WinXP
    AMP套件:WAMP2.0h
    PHPver:5.2.9-2
    MYSQLver:5.1.33
    APACHEver:2.2.11
    <?php
    $SQLstr1='INSERT INTO testTB(id,name)VALUES';
    for($i=1;$i<=50000;$i++)
    {
    $SQLstr1.="('','{$i}'),";
    }
    $SQLstr1=substr($SQLstr1,0,-1);
    $link=mysqli_connect('localhost','root','','test');
    $start_time=microtime();
    mysqli_query($link,$SQLstr1);
    $end_time=microtime();
    $time=$end_time-$start_time;
    echo "using time={$time} sec";
    //有auto_increment=0.271518 sec
    //無auto_increment=0.085321 sec
    ?>
    <?php
    $SQLstr1='INSERT INTO testTB(id,name)VALUES';
    for($i=1;$i<=50000;$i++)
    {
    $SQLstr1.="('','{$i}'),";
    }
    $SQLstr1=substr($SQLstr1,0,-1);
    $link=mysql_connect('localhost','root','');
    mysql_select_db('test');
    $start_time=microtime();
    mysql_query($SQLstr1,$link);
    $end_time=microtime();
    $time=$end_time-$start_time;
    echo "using time={$time} sec";
    //有auto_increment=0.292957 sec
    //無auto_increment=0.085904 sec
    ?>
    就結果來說,在50000筆的條件下,效能差了近4倍,即使用mysqli_query()效率也只有一點點提升
    就實際的情況來說,很抱歉,0.3sec跟0.08sec對人類來說差別並不大 =.=
    是說?您什麼狀況下會同時insert50000筆以上的資料呢?
    以上供大家做個參考
    ps.測試時也使用了mysqli_multi_query()只是結果上跟mysqli_query機乎一樣
Sign In or Register to comment.