2012-11-25 43 views
1

我一直在努力獲取RSS源設置和一些人在這裏幫我完成了。但是,我真的需要一些更有經驗的編程人員的建議,告訴我需要更改哪些內容才能保持相同的功能,但會加快頁面加載速度。如何加快PHP腳本與巨大的MySQL數據庫

它看起來30個RSS項目,並從我的MySQL數據庫中獲取URL。問題是它從該表中超過1億行中隨機選擇30行。這就是它應該做的事情,但是由於它們在表格中有很多行,這實際上減慢了腳本的速度,我需要幫助!

<?php header("Content-type: text/xml"); ?> 
<?php echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; ?> 
<?php include('directory/database.php'); ?> 
<rss version="2.0"> 
<channel> 
    <title>Website Reviews</title> 
    <link>http://www.mywebsite.com</link> 
    <description>Professional Services</description> 
    <pubDate><?echo date('Y/m/d H:i:s');?></pubDate> 

<?php 
    foreach(range(1, 30) as $i): 
$number = mt_rand(1, 141754641); 
$query="SELECT * FROM `list` LIMIT $number , 1"; 
$result = mysql_query($query); 
if($result == false) 
{ 
    user_error("Query failed: " . mysql_error() . "<br />\n$query"); 
} 
elseif(mysql_num_rows($result) == 0) 
{ 
    echo "<p>Sorry, we're updating this section of our website right now!</p>\n"; 
} 
else 
{ 
    while($query_row = mysql_fetch_assoc($result)) 
    { 
     foreach($query_row as $key => $domain) 
     { 
     echo "$value"; 
     } 
    } 
} 
?> 
<item> 
    <title><?php echo $domain; ?> REVIEW</title> 
    <pubDate><?echo date('Y/m/d H:i:s');?></pubDate> 
    <link>http://www.mywebsite.com/review/<?php echo $domain; ?></link> 
    <description>Looking for a review on <?php echo $domain; ?>? We've got it!</description> 
</item> 
<?php endforeach; ?> 

</channel> 
</rss> 

在此先感謝任何人的幫助!

+0

查詢執行需要多長時間? –

+0

我猜選擇ORDER BY RAND()限制30太慢了? – Popnoodles

+0

我測試了幾次,每次都超過5分鐘,一般超過10分鐘。由於它是一個RSS提要,顯然它需要加載速度更快,我只是無法弄清楚如何優化它,以便從數據庫中獲得更快的信息。 – user1850695

回答

1

限制必須做表掃描,所以你想要做的就是使用索引你的優勢。首先,讓我們在名爲「id」的表中添加一個自動增量ID字段。

然後,

<?php 
$result = array(); 
$maxRow = mysql_fetch_assoc(mysql_query("SHOW TABLE STATUS LIKE 'list';")); 
$max = $maxRow["Auto_increment"]; 
$minRow = mysql_fetch_assoc(mysql_query("SELECT id FROM 'list' LIMIT 1;")); 
$min = $minRow["id"]; 
while (count($result) < 30) { 
    $ids = array(); 
    while (count($ids) < 100) { 
     $id = mt_rand($min, $max); 
     $ids[$id] = 1; 
    } 
    $res = mysql_query("SELECT * from 'list' WHERE id IN (" . join(',', array_keys($ids)) . ") LIMIT 30"); 
    while (($row = mysql_fetch_assoc($result)) && (count($result) < 30)) { 
     $result[] = array(...); // stuff results here 
    } 
} 

// output 
?> 
+0

附註:隨機ID可能不會讓你滿30行,所以在這裏我檢查並獲得更多,如果需要。 – Sajid

1

您仍然可以一次選擇全部30個。獲得30條記錄應該不會那麼慢。

$numbers=array(); 
foreach(range(1, 30) as $i): 
    $numbers[] = mt_rand(1, 141754641); 
endforeach; 

$query="SELECT * FROM `list` WHERE `whatever_primary_key_is` IN (".implode(',', $numbers).")"; 
1

可能,我建議一個更可靠的方法。

  1. 你必須採取的帳戶,你去找找數可能不存在
  2. 只使用一個MySQL查詢往往更快

基礎上url1url2

你可以用這個php代碼代替:

<?php 
// Connecting, selecting database 
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or die('Could not connect: ' . mysql_error()); 
    mysql_select_db('my_database') or die('Could not select database'); 

$query = "SELECT `url` 
      FROM `liste` 
      ORDER BY RAND() 
     LIMIT 30" ; 

$result = mysql_query($query); 

if($result == false) 
{ 
    user_error("Query failed: " . mysql_error() . "<br />\n$query"); 
} 
elseif(mysql_num_rows($result) == 0) 
{ 
    echo "<p>Sorry, we're updating this section of our website right now!</p>\n"; 
} 
else 
{ $query_row = array(); 
    while($query_row = mysql_fetch_assoc($result)) 
    { 
     echo $query_row['url']; // no need to do the extra foreach 
    } 
} 

?> 

值mysql_host,mysql_user,mysql_password,my_database應該被您的連接替換。

只要你有30行在你的標題表你沒事。

相關問題