为什么我的mysql查询需要太长时间才能产生结果

时间:2014-11-19 09:54:40

标签: php mysql

您好我编写了以下代码来从数据库中检索数据,但它的执行速度太慢,任何人都可以查看它并提供一些优化技巧以获得更好的性能。

真正发生的是通过绑定来自其他几个表的现有当前数据来创建一个新表。

$table_count = mysql_query("SELECT TABLE_NAME FROM information_schema.tables 
WHERE table_schema = 'datamatrix' 
AND table_name 
LIKE 'tracking_%' ");

while($row = mysql_fetch_array($table_count)){

$trackingtable = $row["TABLE_NAME"];

$update = mysql_query("SELECT id as unp FROM $trackingtable");
$col = mysql_fetch_assoc($update);
$col_id = ($col["unp"]);

$var1 = mysql_query("SELECT useragent as ua 
FROM trackpanel 
WHERE id = $col_id");
$col_ua = ($var1["ua"]);
$browser = get_browser($col_ua, true);


$new_timestamp = mysql_query("SELECT TIMESTAMP FROM $trackingtable 
ORDER BY TIMESTAMP 
DESC LIMIT 1");
        $col_new = mysql_fetch_assoc($new_timestamp);

$new_timestamp1 = mysql_query("SELECT TIMESTAMP FROM $trackingtable 
ORDER BY TIMESTAMP 
ASC LIMIT 1");
$col_old = mysql_fetch_assoc($new_timestamp1);

mysql_query("
INSERT INTO report (`trackingID`,`trackname`,`accountname`,`accountID`, `status`, `clickcount`, `earliest_click`,`recent_click`,`platform`,`device`,`browser`,`browser_version`)
SELECT b.trackingID, `trackname`, accountname, c.accountID, status, total_clicks,'".$col_new['TIMESTAMP']."','".$col_old['TIMESTAMP']."','".$browser['platform']."','".$browser['device_name']."','".$browser['browser']."','".$browser['version']."'
FROM $trackingtable a, datamat b, trackaccounts c
WHERE a.timestamp > DATE_ADD(NOW(), INTERVAL -2 YEAR) AND a.trackingID = b.trackingID AND b.accountID = c.accountID") 
or die(mysql_error());
} 

?>

2 个答案:

答案 0 :(得分:0)

在不知道数据库的设置和索引方式以及您正在使用的表存储引擎的情况下,我只能猜测为什么它的速度很慢。

  1. 您的第一个查询可能会返回多个由表名组成的行
  2. 您运行4个简单的选择语句。
  3. 使用select语句运行插入。这里的选择查询也将3个表连接在一起
  4. 列表的第二部分和第三部分针对从第一个查询循环的每一行运行。如果您的表是InnoDB,则选择将更慢,而插入更快。 MyISAM对面也是如此。

    每个查询都有自己的延迟,因为它会单独查询数据库。最好在while循环中组合第1,第3和第4个查询,因为它们查询同一个表。

    我认为插入和选择查询最有可能是最慢的,因为它加入了3个表。那个选择的查询肯定可以优化。

答案 1 :(得分:0)

您的查询速度缓慢的唯一原因是您的跟踪表上缺少索引,即使您没有指定哪个查询速度很慢。

检查

上的索引是否存在
    表格trackpanel上的
  • 列ID
  • 在表可跟踪表上列出timestamp和trackingID,
  • 表datamat上的trackingID和accountId,
  • 表格trackaccounts上的
  • 列accountId