PHP最快的方式是在MYSQL中注册数百万条记录

ipe*_*pel 7 php mysql performance

我必须在我的数据库中注册数百万的页面浏览量,我正在寻找减少服务器负载的最佳解决方案.

1.实际解决方案:检查是否唯一,并在"原始"表和"优化"表中注册

// script
$checkUnique = mysqli_query( $con, "SELECT FROM rawTable
         WHERE datatime = '$today' AND ip = '$ip'
         ORDER BY datetime DESC LIMIT 1" );
mysqli_query( $con, "INSERT INTO rawTable ( id, datetime, url, ip, ua )
         VALUES ( NULL, '$now', '$url', '$ip', '$ua' )" );
if( mysqli_num_rows( $checkUnique ) == 0 ) {
    mysqli_query( $con, "INSERT INTO optimizedTable ( id, day, total )
                         VALUES ( NULL, '$today', 1 )" ); }
else{
    mysqli_query( $con, "UPDATE optimizedTable SET total = total + 1
            WHERE day = '$today' ORDER BY day DESC LIMIT 1"; }
Run Code Online (Sandbox Code Playgroud)

2.仅在"原始"表中注册视图,然后使用cronjob填充"优化"表

// script
mysqli_query( $con, "INSERT INTO rawTable ( id, datetime, url, ip, ua, alreadyOptimized )
         VALUES ( NULL, '$now', '$url', '$ip', '$ua', 0 )" );

// cronjob -> check if is unique, populate mysql tables +
//         change column alreadyOptimized from 0 to 1 in raw table
Run Code Online (Sandbox Code Playgroud)

3.在txt或csv文件中注册原始视图,然后使用cronjob填充mysql表

// script
$file = fopen("file.txt", "w");
fwrite($file, "$now,$url,$ip,$ua\n");

// cronjob -> check if is unique, populate mysql tables + delete rows from txt/csv file
Run Code Online (Sandbox Code Playgroud)

什么是最好(最轻和最快)的方式?还有更好的解决方案吗?

PS:服务器负载是由select查询引起的,用于检查视图是否唯一

Mjh*_*Mjh 9

手动选择检查记录是否存在是最糟糕的事情 - 它可以(并且会)产生错误的结果.MySQL与连接它的任何进程之间存在时间差.唯一正确的方法是放置UNIQUE约束,简单地说就是INSERT.这是100%确定您的数据库不会包含重复项的唯一方法.

这对您的用例有用的原因是它将您的代码减少了50%.你不必SELECT先,因此你摆脱了一个巨大的瓶颈.

使用INSERT IGNORE或者INSERT INTO .. ON DUPLICATE KEY UPDATE如果需要更新现有记录.

您的唯一约束是datetime, ip列的复合索引.为了进一步优化这一点,您可以binary(20)在表中创建一个列,并使其包含组合sha1哈希值datetime, ip.使用触发器,您可以在插入之前创建哈希,使整个过程对插入表中的实际人员不可见.

如果插入失败,则存在记录.如果插入成功,那么你已经完成了你想做的事情.不SELECT使用应该会产生性能.之后,如果它仍然很慢 - 它只是您使用的服务器的I/O限制,您需要在硬件级别上寻找优化.

  • @KarolyHorvath - 非常有用的评论,感谢您花时间帮助改进我的答案. (4认同)