2016-09-21 70 views
-1

我有2個表,一個有200萬,另一個有3000萬條記錄, 我需要比較兩個表上的記錄,但這是非常緩慢的。增加Mysql/PHP的查詢速度

任何人都可以提供關於如何提高速度的建議嗎?

<?php 
$con = mysql_connect("localhost","root","password"); 
mysql_select_db("DMBONE", $con); 
$result = mysql_query("SELECT * FROM sucid where priority=''"); 
while($row = mysql_fetch_array($result)) 
{ 
$result1 = mysql_query("SELECT count(*) FROM bills_logic where month(tdate)=8 and x1=".$row[0].""); 
if($row1 = mysql_fetch_array($result1)) 
{ 
if($row1[0]==0) 
{ 
echo $row[0]." DEAD\r\n"; 
mysql_query("update sucid set priority='DEAD' where bid=".$row[0]."") or die(mysql_error()); 
} 
else 
{ 
echo $row[0]." ".$row1[0]."\r\n"; 
mysql_query("update sucid set priority='".$row1[0]."' where bid=".$row[0]."") or die(mysql_error()); 
} 
} 
} 
?> 


CREATE TABLE `sucid` (
`bid` varchar(500) NOT NULL, 
`priority` varchar(500) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

    CREATE TABLE `bills_logic` (
`bid` int(11) NOT NULL AUTO_INCREMENT, 
`num` varchar(500) NOT NULL, 
`stat` varchar(500) NOT NULL, 
`tdate` varchar(500) NOT NULL, 
`x1` varchar(500) NOT NULL, 
`amt` varchar(500) NOT NULL DEFAULT '30', 
PRIMARY KEY (`bid`) 
) ENGINE=InnoDB AUTO_INCREMENT=35214848 DEFAULT CHARSET=latin1 

上面是表的創建表語句。

回答

0

您已經發現世界上最慢的做法join。你可能會更樂意做的老式的方式(只是時髦足夠使用mysqli):

<?php  
    $mysqli = new mysqli("localhost","root","password","database"); 
    if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
    } 

    $sql = "update sucid 
      left join (
      select count(*) as priority, x1 
      from bills_logic b 
      where month(tdate)=8 
      group by x1 
     ) bg 
      on bg.x1 = sucid.bid 
      set sucid.priority = coalesce(bg.priority,'DEAD');" 

    if ($mysqli->query($sql) === TRUE) { 
    printf("I'm done already. This was fast, wasn't it?\n"); 
    } 
    else { 
    echo "Something went wrong: " . $mysqli->error . "\n"; 
    exit(); 
    } 

?> 

你可能想在bills_logic.x1添加索引,雖然它不會幫助太多了這裏。

而且你應該確實修復你的列,例如tdate不應該是varchar(500)。如果您有任何有無效日期的行,更新將完全失敗。使用正確的數據類型可防止出現無效值。 num,statamt聽起來像它們可能是int(或者可能是decimal),x1也可能是。如果您將DEAD替換爲0,則您的priority列也可以作爲int工作。

+0

謝謝,會試試這個 –

+0

工作就像一個魅力,我真的需要刷上我的sql。 –

0

我會建議創建索引,特別是用於定義您的搜索的值。在您的具體情況下,我將首先創建優先級的索引。

有關mysql如何處理索引的更多信息,請參閱here

0

是的,有可能你有一個很大的問題。速度和查詢性能取決於:

  1. 數據庫模式表結構。
  2. 機器硬件規格。
  3. 您的查詢結構。
  4. 表索引。

希望所有數據庫專家不要在同一張表中包含blob,這是主表。當我們談論上百萬個數據時,這是所有數據庫的大問題。總是按照最佳實踐分離blob數據更好。

這只是附加信息,希望它可以幫助其他人。