从mysql数据库中提取数据提取性能

时间:2016-12-21 18:54:01

标签: php mysql

  

例如,我有一个表“tbl_book”,其中包含100个或更多记录,如mysql“db_bookshop”中的book_name,book_publisher,book_author,book_rate等多个列。现在我想通过一次查询获取它们而不需要迭代100次而不是一次或两次循环。可能吗?有没有什么棘手的方法可以做到这一点。通常我们会做什么

$result = mysql_query("SELECT desire_column_name FROM table_name WHERE clause");
while( $row = mysql_fetch_array($result) ) {
    $row['book_name']; 
    $row['book_publisher']; 
    $row['book_author']; 
    ..........
    $row['book_rate']; 
}

// Or we may can use mysqli_query(); -mysqli_fetch_row(), mysqli_fetch_array(), mysqli_fetch_assoc();
  

我的问题是,我们有什么想法或任何棘手的方式   避免1oo次迭代获取1oo记录?这可能是有线的   一个人,但最有经验的程序员之一告诉我,这是   可能。但不幸的是,我无法向他学习。一世   为他感到难过,因为他已经不在了。感谢你的想法分享。

5 个答案:

答案 0 :(得分:1)

您不应该使用mysql_query不推荐使用mysql扩展名:

  

自PHP 5.5.0起,该扩展已弃用,自PHP 7.0.0起已被删除。

- https://secure.php.net/manual/en/intro.mysql.php

当您使用PDO时,您可以获取所有项目,而不会像这样

循环查询
$connection = new PDO('mysql:host=localhost;dbname=testdb', 'dbuser', 'dbpass');
$statement = $connection->query('SELECT ...');

$rows = $statement->fetchAll();

答案 1 :(得分:0)

您是否尝试过使用mysql_fetch_assoc

$result = mysql_query("SELECT desire_column_name FROM table_name WHERE clause");

while ($row = mysql_fetch_assoc($result)) {

    // do stuff here like..

    if (!empty($row['some_field'])){
        echo $row["some_field"];
    } 
}

答案 2 :(得分:0)

简短的回答 - NO ,没有循环就无法从数据库中获取多条记录。

但这里的问题是你不想要它。

“仅提取”数据毫无意义 - 你总是会对它做些什么。 每一行。显然,循环是对每一行做某事的自然方式。因此,试图避免循环是没有意义的 这使你的问题变得毫无意义。

关于表现。事实是,您遇到与从数据库中仅提取100条记录相关的非单一性能问题。这使你的问题成为一个虚构的问题。

我能想到的唯一可信的问题是你作为一名程序员的表现,因为缺乏教育会让你写下很多不必要的代码。如果您设法就此问题提出某个问题,您将会看到一种避免无用重复输入的方法。

答案 3 :(得分:0)

可以通过硬编码主列值来读取所有100条没有循环的记录,但这将涉及列出100 x列数,并且可以在MySQL中显示的列数有限制。 / p>

例如,

select 
case when book_name='abc' then book_name end Name, 
case when book_name='abc' then book_publisher end as Publisher, 
case when book_name='abc' then book_author end as Author, 
case when book_name='xyz' then book_name end Name, 
case when book_name='xyz' then book_publisher end as Publisher, 
case when book_name='xyz' then book_author end as Author,
...
...
from 
db_bookshop;

这不实用,但如果您要查询的行数较少,则可能会发现它很有用。

答案 4 :(得分:0)

向MySQL服务器询问某事的时间远远大于通过客户端$(document).on('click', 'button.submit-btn', function () { alert('Please wait...'); setTimeout(function() { $('button.submit-btn').attr('disabled', true); }, 50) $('#send-form').ajaxForm(function() { var currentAlert = $.jAlert('current'); currentAlert.closeAlert(); successAlert('Success!', 'The form has been submitted'); $('button.submit-btn').attr('disabled', false); }); }); <form action="" method="post" id="send-form"> <button type="submit" class="submit-btn" name="send-modal-form" value="submit"></button> </form> 循环的一次迭代。因此,为了提高性能,目标是让WHILE一次往返中转到服务器。不同的API调用会执行此操作或不执行此操作;阅读他们的详细信息。

我已经编写了很多关于MySQL的UI。我认为不会同时获取几十行,然后使用结果构建SELECT(或其他内容)。我很少获取超过100,不是因为性能,而是因为100(通常)太多,用户无法接收单个网页。

另外,我认为发布几个,也许几十个查询以支持单个网页。延迟是微不足道的,特别是与用户阅读,消化和移动到下一页的时间相比。因此,我尝试向用户提供可消化的信息量,而无需点击其他页面以获得更多信息。有权衡。

如果让SQL执行“消化”操作是可行的,请执行此操作。 MySQL会更快地执行<table>并返回总数,而不是返回几十行供客户端添加。这主要是带宽&#39;问题。无论哪种方式,MySQL都会(内部)获取所有需要的行。