繁体   English   中英

提高 Mysql/PHP 查询速度

[英]Increase Mysql/PHP Query Speed

我有 2 个表,一个有 200 万条记录,另一个有 3000 万条记录,我需要比较两个表上的记录,但这非常慢。

任何人都可以提供有关提高速度的方法的建议吗?

<?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

以上是表的创建表语句。

我建议创建索引,特别是对于您用来界定搜索的值。 在您的特定情况下,我将首先为字段priority创建索引。

有关 mysql 如何处理索引的更多信息,请查看此处

是的,您可能遇到了很大的问题。 速度和查询性能取决于:

  1. 数据库模式表结构。
  2. 机器硬件规格。
  3. 您的查询结构。
  4. 表索引。

希望所有数据库专家不要将 blob 包含在作为主表的同一个表中。 当我们谈论要获取的一百万数据时,这是所有数据库的大问题。 最好将 blob 数据始终作为最佳实践进行分离。

这只是额外的信息,希望它可以帮助其他人。

您已经找到了世界上最慢的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) 如果您有任何日期无效的行,更新将完全失败。 使用正确的数据类型可以防止您使用无效值。 numstatamt听起来可能是int (或者可能是decimal ),也可能是x1 如果您将DEAD替换为0 ,您的priority列也可以用作int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM