mysql sorgu optimizasyonu

4 Cevap php

benim x tabloda (1.049.906 toplam, Sorgu 0.0005 saniye sürdü) civarında olması,

Ben sadece, belirli bir alan kayıtlar alınamadı çalışıyor almak durumunda

Onun Tooklar neredeyse 6 dakika,

Bu benim sorgu

SELECT CUSTOMER_CODE FROM X_TBL ;

CUSTOMER_CODE => EŞSİZ

YUKARIDA SORGU, 6min ALDI

Bu Tel beni optimizasyon ipuçları,

Ayrıca müşteri aramak için bazı durumlarda, i, benzeri CUSTOMER_CODE kullanılan

X_TBL gelen CUSTOMER_CODE seçmek NEREDE CUSTOMER_CODE GİBİ "$ KEY_WORD%"

yes i endeksi var.

Php ... betik çalıştırma zamanlamasını kontrol nasıl,

i pasajı aşağıda kullanılan ama her zaman artan yönelik gösteren ..

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

Regards Bharanikumar

4 Cevap

Ben bu hakkı anlamak, bir tablodaki bir milyondan fazla kayıt var ve bu all Bunlardan bir kez gelen CUSTOMER_CODE almak için 6 dakika sürer merak? "Optimize" bir şey yok, büyük olasılıkla farklı sveyaguları gibi bir şey inşa etmek gerekir

SELECT CUSTOMER_CODE FROM X_TBL LIMIT 0, 100;

veya

SELECT COUNT(CUSTOMER_CODE) FROM X_TBL;

veya whatever, depending on the task you're trying to solve.

As of searching by CUSTOMER_CODE, in case of LIKE "$KEY_WORD%" simple index on CUSTOMER_CODE will help, but again, don't try to select all recveyads at once, except fveya cases where you do really need this.

Dizinleri kullanmayı deneyebilirsiniz, onun çok sorgular süresini optimize.

Bu bağlantıyı deneyin:

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

Belki gerçek veri aktarımı darboğaz olduğunu. Bir genellikle başka bir konuma (proses) bir ilişkisel veritabanı içindeki tüm veri aktarımı önler.

But for arguments sake and for testing if this is really the bottleneck: You might try an unbuffered query, i.e. use a function/method that doesn't transfer all the data before it returns, see PDO::MYSQL_ATTR_USE_BUFFERED_QUERY and mysql_unbuffered_query.
And while we are at it you can also try MySQL's EXPLAIN and see if it sheds some light on the issue.

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

Eğer tablo bu kadar çok sayıda kayıt varsa o da aykırı myisam motoru sadece tablo verileri önbelleğe alır gibi kayıtlar innodb sayıda için çok daha hızlı olduğu için, o ilk şey, onun InnoDB değilse InnoDB için tablo motorunu değiştirmek için dizinleri önbelleğe böylece gerekli veri kütüğü getirilecek olamaz eğer diskten tam tablo taraması yapmak zorunda her zaman.

Eğer myisam kalmak istiyorum ikincisi eğer CUSTOMER_CODE sütun üzerinde bir dizin oluşturun. Sonra tüm mysql sorgu için endeksi getirme ilgisi yoktur çünkü hızlı sorgu yapacak:

SELECT CUSTOMER_CODE FROM X_TBL