2010-08-07 4 views
10

MySQL kullanan bir e-ticaret uygulamasına sahibim ve daha hızlı olmasını istiyorum. Daha önce erişilen web sitesinde bir parça # erişildiğinde, gerekli tüm veriler zaten INNODB arabellek havuzunda olduğundan hızlı bir şekilde yüklenir. Bununla birlikte, eğer parça # daha önce hiç yüklenmemişse, bu veri henüz tampon havuzunda değildir, bu yüzden diskten okunması gerekir ve bu yavaştır. INNODB arabellek havuzumu 2GB olacak şekilde ayarladım ve bu veritabanının tamamı yaklaşık 350MB'ydi, yani tüm veritabanını arabellek havuzuna yüklemek için bolca alan var. INNODB istatistiklerinden şu an sadece tampon havuzun yarısının kullanıldığını görebiliyorum.Tablolar MySQL ile INNODB arabellek havuzuna nasıl yüklenir?

Quickly preloading Innodb tables in the buffer pool veya mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole gibi arabellek havuzunu "ısıtmak" olarak da bilinen verileri önceden yüklemeye ilişkin referanslar buldum .html. Bu strateji temel olarak MySQL'in verileri önceden yüklemek için yerel bir yolu olmadığı için her tabloya bir tablo taraması yapmayı gerektirir.

Veritabanımdaki her tabloyu listeleyen ve bunu yapmak zorunda olan bir komut dosyasını el ile oluşturmak istemiyorum. Her bir tabloyu otomatik olarak seçen ve seçen bir komut dosyası nasıl oluşturabilirim ve otomatik olarak bir dizin taraması yapılmadan tablo taraması yapılır?

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

Daha sonra her tablo adı kuvvet tablo taraması için: manuel giriş onlara zorunda kalmamak

cevap

0

Bu sorgu, veritabanınızda tablo adlarını döndürür.

22

Bu sayede çalıştırmak için sorgularının bir listesini vermelidir;)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

Sen saklı yordam koydu ve imleç resultset üzerinde gidebilir. Her satırdan hazırlanmış bir deyim oluşturun ve çalıştırın.

+3

Bu algoritma basit ve parlaktır. Bu, innodb verilerini önbelleğe alacaktır. Bu tüm önbellek dizin sayfalarını önbelleğe alacağından emin değilim, ancak algoritmanız bunu yapmak için hızlı bir şekilde uygulanabilir. MyISAM'ın sadece MYI dizin sayfalarını önbelleğe aldığına inanıyorum. Yine, algoritmanız tablolar ve dizinler üzerinden geçmek için temel oluşturur. Bravo (ve +1) !!!! – RolandoMySQLDBA

+1

Mine, yalnızca bir sorgu listesi almak için yapılan bir uygulamadır. Fikir, Soruya bağlı Mysql Performans Blogundan geliyor. – Mchl