Çok yavaş bir indeks eklemek… Bir ETA almak veya ilerleme göstermek için mysql cmd var mı?


13

Şu anda bir dizin eklemek için benim tablo (20M girişleri) alter sorgusu çalıştırıyorum. zaten 3 günden daha uzun bir süredir çalışıyor ('tmp tablosuna kopyala').

Sorgunun ilerlemesini görebilmemin bir yolu var mı, başka bir deyişle, tahmin zamanını tamamlayabileceğim bir yol var mı?

Teşekkürler.


4
MyISAM? InnoDB'nin? InnoDB ise, tablo başına dosya açık mı?
Charles

Büyük soru - anında düşünebileceğim en iyi şey, ham geçici ve gerçek dosyaların boyutunu kullanarak kaba bir tahminde bulunmaktır - yine de biraz daha araştırma yapacak

Lütfen SHOW CREATE TABLE tblname\Gmasada ve bize yapmak istediğiniz dizini söyleyin.
RolandoMySQLDBA

Yanıtlar:


3

Mysql bir tabloyu değiştirdiğinde, temelde bir kopyasını oluşturur ve kopyayı değiştirir. Bu şekilde güncellemeyi ortadan kaldırırsanız, tablo hala kararlı durumdadır. Böylece yeni dosyanın ne kadar büyük olduğunu görmek için mysql veri dizinine (/ var / lib / mysql /?) Bakabilirsiniz. Bu Innodb ile biraz daha zor, ama bir yerde oluşturulan bir tmp tablo var.

Sıralama arabelleği değişkenlerinizi (myisam_sort_buffer_size, sort_buffer_size) artırarak bir dizinin aldığı süreyi önemli ölçüde azaltabilirsiniz. Bunları sahip olduğunuz hafıza ile mümkün olduğunca büyük yapın. Ne kadar hafızanız olduğuna bağlı olarak, değişiklik zamanından birkaç gün kesebilir, hatta birkaç saate kadar düşebilirsiniz. Yaklaşık 3 saat içinde 150 milyon kayıt tablosu yaptım.


Ne yazık ki herhangi bir tmp tablo bulunamadı. Ben innoDB, innodb_file_per_table kapalı olarak ayarlayın.

2

İnnodb_fle_per_table KAPALI olduğundan, tabloyu göremez ve ilerlemesini ölçemezsiniz.

MyISAM için bunun nasıl yapılacağı hakkında daha önce bir yazı yaptım . Bunu InnoDB için ancak yalnızca innodb_file_per_table etkinleştirilmişse ve InnoDB altyapısını yeniden ararsanız yapabilirsiniz . Yine de işletim sisteminde söz konusu dosyaların boyutlarına bakmayı gerektirir.

InnoDB Cleanup uygulamasını tam olarak uyguladıktan ve innodb_file_per_table özelliğini etkinleştirdikten sonra, dizin güncellemesini aşağıdaki gibi gerçekleştirmek isteyebilirsiniz:

EXAMPLE aşağıdakilere sahip

  • Datadir olarak / var / lib / mysql ile MySQL Örneği
  • InnoDB tablosu db.lotsofdata20 milyon adla çağrıldı :

Tablo şöyle:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

Bir ad dizini oluşturmak istediğinizi varsayalım. Bunu yapabilirsiniz:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

INSERT çalışırken, işletim sistemine girip şunu çalıştırırsınız:

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

Bu size geçerli boyutunun bir listesini verecektir lotsofdata_new.ibd. Daha büyük olduğunda lotsofdata.ibd, tamamlanmaya yakın olduğunuzu bilirsiniz.

BTW MariaDB'nin dahili olarak İlerleme Durumu vardır .


Geri bildirimleriniz için teşekkürler. Şimdilik, sorguyu öldürmeye ve son mysql sürümüne yükselttikten sonra tekrar denemeye karar verdim. umarım bu şekilde daha sorunsuz ilerler.
Atai Voltaire

1

Bir dizin oluşturma işleminin ilerlemesini görmenin güvenilir bir yolu yoktur. Tablo başına innodb dosyası varsa, veri dizininde oluşturulan geçici .ibd dosyasına bakarak ve geçerli dosyanın boyutuyla karşılaştırarak bazı göstergeler alabilirsiniz, ancak bu çok da değil geçerli veri dosyanız silme / parçalanma nedeniyle şişirilebileceğinden ve yeni veri dosyasının öncekinin sahip olmadığı ek bir dizini olacaktır.

InnoDB eklentisi kurulu olmadan MySQL sürümünü kullandığınız anlaşılıyor . InnoDB eklentisi, dizin ekleme ve silme işlemleri için tablonun tamamen yeniden oluşturulmasını gerektirmeyen hızlı dizin oluşturma özelliğine sahiptir . InnoDB eklentisi MySQL 5.5'te varsayılan olarak etkindir ve 5.1.38 ve sonraki sürümlerde bir yapılandırma ayarıyla kullanılabilir.

  • Hangi MySQL sürümünü kullanıyorsunuz?

Percona Server, InnoDB Plugin varsayılan olarak etkin bir şekilde geri (5.5 öncesi).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.