Bilimsel veri analizi için iş istasyonumda bir MySQL 5.5 sunucusu çalıştırıyorum ve performans açısından en iyi şekilde yararlanmak için MySQL'in nasıl yapılandırılacağını merak ediyorum. Genellikle çalıştırdığım sorgu türleri 10-20 tablo birleşimleri içerir ve oldukça uzun süre çalışabilir, bir ila birkaç dakika hiç bir istisna değildir. Veritabanına aynı anda yalnızca çok az kullanıcı erişiyor (en fazla 5 kullanıcı). Sunucuyu 2.2 GHz Çift Çekirdekli ve 4 GB RAM'li bir Lenovo Thinkpad T61'den elle seçilen bileşenlere sahip yepyeni bir makineye taşıdım:
- Intel i7 3770, 4x 3,4 GHz (4x3,7 GHz'de çalışıyor)
- Z77 yonga seti
- 16 GB DDR3 1600 RAM
- Windows 7 Prof 64 bit
- Windows ve MySQL sunucusu Intel 520 serisi SSD sürücüde çalışır.
İlk testler (her iki makinede de aynı sorguyu çalıştırıyor), yenisi için hızda kesin bir iyileşme gösterdi, ancak sorgular hala çok zaman alıyor ve daha fazla artış bekliyordum. Söz konusu sorgular oldukça iyi bir şekilde optimize edilmiştir, yani tüm tablolar "genişletilmiş açıklama" olarak da kullanılan uygun anahtarlara sahiptir.
Şimdi mevcut MySQL ayarlarıma: Öncelikle uzun zaman önce MyISAM'dan Innodb'a geçtiğimi söylemeliyim.
Bazı my.ini ayarlarım (varsayılan ayarlardan çıkışlar):
# Maximum size for internal (in-memory) temporary tables. If a table
# grows larger than this value, it is automatically converted to disk
# based table This limitation is for a single table. There can be many
# of them.
#tmp_table_size=35M
tmp_table_size=4000M
max_heap_table_size=4000M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
#innodb_buffer_pool_size=96M
innodb_buffer_pool_size=800M
general-log
expire_logs_days = 60
general_log_file = "F:/my_query_mysql.log"
log-output = TABLE
optimizer_search_depth = 0 #meant to cure the "statistics state" bug in some queries
Birinin yukarıdaki sayılarda değişiklik veya daha önce bilmediğim diğer ayarlarda değişiklik önerip önermeyeceğini bilmek istiyorum.
Herhangi bir yararlı söz için teşekkür ederiz.
Steve
EDIT: 10-20 tablo arasında birleştirmeler içeren iki sorgu var ve bunları Lenovo dizüstü bilgisayarımda ve yeni PC'de çalıştırdı. Sorgu # 1 dizüstü bilgisayarda 9m11s vs yeni makinede 3m36s aldı; Sorgu # 2 dizüstü bilgisayarda 48.5s vs iş istasyonunda 22.5s aldı. Böylece yürütme hızı kabaca 2-2.5 faktörü ile geliştirildi. İş istasyonunda RAM'in% 50'si bile kullanılmadı. Dört çekirdekteki ortalama CPU yükü (Windows Görev Yöneticisi tarafından bildirildiği gibi) sadece% 13 idi. Çekirdek başına yük (Core Temp tarafından bildirildiği gibi) ONE çekirdeği için yaklaşık% 25-40 iken, diğerleri için <=% 10'du, bu da MySQL'in tek bir sorgu için birden fazla çekirdek kullanmadığını gösterir .