mysql查询优化

时间:2010-05-31 07:49:04

标签: php mysql

我的x表中有大约(总共1,049,906,查询耗时0.0005秒),

如果我只是检索试图检索特定的字段记录,

它花了不到6分钟,

这是我的查询

SELECT CUSTOMER_CODE FROM X_TBL ;

CUSTOMER_CODE =>独一无二的

上面的问题是6MIN,

请联系我优化提示,

在某些搜索客户的情况下,我也使用了CUSTOMER_CODE,

从X_TBL中选择CUSTOMER_CODE WHERE CUSTOMER_CODE如“$ KEY_WORD%”

是的,我有索引。

如何检查脚本执行时间......在php中,

我使用了下面的代码片段,但它总是显示出增加...

   list ($msec, $sec) = explode(' ', microtime());
$microtime = (float)$msec + (float)$sec;

此致 Bharanikumar

4 个答案:

答案 0 :(得分:2)

如果我理解这一点,你在表格中有超过一百万条记录,并想知道为什么一次从所有中获取CUSTOMER_CODE需要6分钟?没有什么可以“优化”,很可能你需要构建类似

的不同查询
SELECT CUSTOMER_CODE FROM X_TBL LIMIT 0, 100;

SELECT COUNT(CUSTOMER_CODE) FROM X_TBL;

或者其他什么,取决于您尝试解决的任务。

截至CUSTOMER_CODE进行搜索,LIKE "$KEY_WORD%" CUSTOMER_CODE上的{{1}}简单索引会有所帮助,但请勿尝试选择所有记录立刻,除了你确实需要这个的情况。

答案 1 :(得分:1)

您可以尝试使用索引,它可以非常优化查询时间。

试试这个链接:

http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm

答案 2 :(得分:0)

也许实际的数据传输是瓶颈。通常可以避免将关系数据库中的所有数据传输到另一个位置(进程)。

但是为了论证和测试这是否真的是瓶颈:您可以尝试一个无缓冲的查询,即使用在返回之前不传输所有数据的函数/方法,请参阅PDO::MYSQL_ATTR_USE_BUFFERED_QUERY和{ {3}}。
虽然我们在这里,你也可以尝试mysql_unbuffered_query,看看它是否能解释这个问题。

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$KEY_WORD = 'something%';

foreach( $pdo->query("EXPLAIN SELECT CUSTOMER_CODE FROM X_TBL WHERE CUSTOMER_CODE LIKE '$KEY_WORD'", PDO::FETCH_ASSOC) as $row ) {
  foreach($row as $k=>$v) {
    echo "$k=$v | ";
  }
  echo "<br />\n";
}


$start = microtime(true);
// test #1
if ( true ) {  // set this to false after the first test  
  $stmt = $pdo->prepare('SELECT CUSTOMER_CODE FROM X_TBL', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
  $stmt->execute();
}
// test #2
else {
  $stmt = $pdo->prepare('SELECT CUSTOMER_CODE FROM X_TBL WHERE CUSTOMER_CODE LIKE :search', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
  $stmt->execute( array(':search'=>$KEY_WORD) );
}
$end = microtime(true);

echo 'time: ', $end-$start;

答案 3 :(得分:0)

如果表中有这么多记录,那么第一件事就是将表引擎更改为innodb(如果它不是innodb),因为对于大量记录,innodb在缓存表数据时要快得多,而相反myisam引擎只缓存索引,因此如果无法从索引中获取所需的数据,则每次必须从磁盘执行全表扫描。

其次,如果你想继续使用myisam,那么在CUSTOMER_CODE列上创建一个索引。这将使查询更快,因为所有mysql必须做的是获取查询的索引:

SELECT CUSTOMER_CODE FROM X_TBL