2010-05-31 181 views
2

我身边(1049906总计,查询花费0.0005秒)我的X平台,MySQL查询优化

如果我只检索试图以检索特定领域的记录,

它几乎tooks 6分钟,

这是我的查询

SELECT CUSTOMER_CODE FROM X_TBL ; 

CUSTOMER_CODE => UNIQUE

上述查询了6MIN,

电话我的优化建议对于这一点,

而且在某些情况下寻找客户,我用像CUSTOMER_CODE,

从X_TBL WHERE CUSTOMER_CODE LIKE“$

选择CUSTOMER_CODE KEY_WORD%“

是的,我有索引。

如何检查脚本的执行时机...在PHP中,

我用下面的代码片段,但它始终朝着增加显示..

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

问候 Bharanikumar

+0

检查您是否有该字段的索引。 – hgulyan 2010-05-31 07:51:20

+0

你用什么函数/方法来执行查询? (mysql_query,pdo-> query,...?)您可以将SHOW CREATE TABLE X_TBL的输出添加到您的问题中吗? – VolkerK 2010-05-31 09:26:10

+0

为什么你需要100万的客户代码?客户代码的长度是多少?可能,它可以缩短?希望你不要使用VARCHAR(255)呢? – 2010-05-31 09:26:50

回答

2

如果我没有理解这个权利,你有一个表,不知道为什么它需要6分钟,从他们的所有得到CUSTOMER_CODE超过一百万条记录一旦?没有什么“优化”是,最有可能你需要建立不同的查询类似

SELECT CUSTOMER_CODE FROM X_TBL LIMIT 0, 100; 

SELECT COUNT(CUSTOMER_CODE) FROM X_TBL; 

或什么的,这取决于你试图解决的任务。

正如CUSTOMER_CODE搜索,在LIKE "$KEY_WORD%"简单指标的情况下,对CUSTOMER_CODE帮助的,但同样的,不要试图一次选择所有记录,除了在那里你真的需要这个案件。

0

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

但是出于参数和测试,如果这确实是瓶颈:您可以尝试使用未缓冲的查询,即使用不返回所有数据的函数/方法,请参阅PDO::MYSQL_ATTR_USE_BUFFERED_QUERYmysql_unbuffered_query
虽然我们在它,你也可以尝试MySQL's EXPLAIN,看看它是否对这个问题有所了解。

$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; 
0

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

其次,如果您想留在myisam中,则在CUSTOMER_CODE列上创建一个索引。这将使查询快速,因为然后所有mysql必须要做的是获取查询的索引:

SELECT CUSTOMER_CODE FROM X_TBL