Kullanıcıların yavaş bulduğu bir site (Moodle) kullanıyoruz. Sanırım diskte geçici tablolar oluşturmak için MySQL'in problemini izledim. Değişkeni created_tmp_disk_tables
Mysql Workbench sunucu yönetiminde izliyorum ve yaklaşık 50 tablo / sn ile sayı artıyor. Bir gün kullanımdan sonra created_tmp_disk_tables
,> 100k. Ayrıca, bellek serbest gibi görünmüyor. Sistem kullanılamaz hale gelinceye kadar kullanım artmaya devam ediyor ve MySQL'i yeniden başlatmamız gerekiyor. Hemen hemen her gün yeniden başlatmam gerekiyor ve kullanılabilir hafızanın yaklaşık% 30-35'ini kullanmak ve günü% 80 ile bitirmekle başlıyor.
Veritabanında BLOB'larım yok ve sorgular üzerinde kontrolüm de yok, bu yüzden onları optimize etmeye çalışamıyorum. Ayrıca bir konfigürasyon dosyası oluşturmak için Percona Onaylama Sihirbazı'nı kullandım, ancak my.ini de sorunumu çözmedi.
Sorular
MySQL'in diskte geçici tablolar oluşturmasını engellemek için neyi değiştirmeliyim? Değiştirmem gereken ayarlar var mı? Daha fazla hafıza atmalı mıyım?
MySQL'in hafızamı yemesini nasıl durdurabilirim?
Düzenle
slow_queries
Günlüğü etkinleştirdim ve sorgunun SELECT GET_LOCK()
yavaş kaydedildiğini öğrendim . Hızlı bir arama PHP yapılandırmasında ( mysqli.allow_persistent = ON
) kalıcı bağlantılara izin verdiğimi gösterdi . Bunu kapattım. Bu, MySQL'in bellek tüketme oranını düşürdü. Yine de geçici tablolar yaratıyor.
Ayrıca key_buffer size
yeterince büyük olduğunu kontrol ettim . Değişkene baktım key_writes
. Bu sıfır olmalı. key_buffer_size
Olmazsa , artırın. Sıfır key_reads
ve sıfır var, key_writes
bu yüzden key_buffer_size
yeterince büyük olduğunu varsayıyorum .
Ben artmış tmp_table_size
ve max-heap-table-size
tablolar bellekte sığamaz gösterebilir Created_tmp_disk_tables artışa olarak 1024M için. Bu çözmedi.
Düzenle 2
sort_merge_passes
SHOW GLOBAL STATUS çıktısında saniyede çok sayıda görürseniz , sort_buffer_size
değeri artırmayı düşünebilirsiniz . sort_merge_passes
Bir saatte 2 tane vardı , bu yüzden sort_buffer_size
yeterince büyük olduğunu düşünüyorum.
Ref: Mysql Manuel açık sort_buffer_size
Düzenle 3
Sıralama değiştirdim ve arabellekleri @RolandoMySQLDBA tarafından önerilen şekilde birleştirdim. Sonuç aşağıdaki tabloda gösterilmektedir, ancak bunun created_tmp_tables_on_disk
hala yüksek olduğunu düşünüyorum . Değeri değiştirip created_tmp_tables_on_disk
bir gün (8h) sonra kontrol edip ortalamayı hesapladıktan sonra mysql sunucusunu yeniden başlattım . Başka bir önerin var mı? Bana öyle geliyor ki, bir çeşit kabın içine uymayan bir şey var ama ne olduğunu çözemiyorum.
+---------------------+-------------+-------------+--------------------+
| Tmp_table_size, | Sort_buffer | Join_buffer | No of created |
| max_heap_table_size | | | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M | 256K | 256K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 512K | 512K | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 1M | 1M | 100k/h |
+---------------------+-------------+-------------+--------------------+
| 125M | 4M | 4M | 100k/h |
+---------------------+-------------+-------------+--------------------+
Bu benim yapılandırmam:
+-----------------------+-----------------------+
|DATABASE SERVER |WEB SERVER |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48 |IIS 7.5 |
+-----------------------+-----------------------+
|4 Core CPU |4 Core CPU |
+-----------------------+-----------------------+
|4GB RAM |8GB RAM |
+-----------------------+-----------------------+
Ek bilgi
+--------------------+---------+
|PARAM |VALUE |
+--------------------+---------+
|Num of tables in Db |361 |
+--------------------+---------+
|Size of database |2.5G |
+--------------------+---------+
|Database engine |InnoDB |
+--------------------+---------+
|Read/write ratio |3.5 |
|(Innodb_data_read/ | |
|innodb_data_written)| |
+--------------------+---------+
|Avg table size |15k rows |
+--------------------+---------+
|Max table size |744k rows|
+--------------------+---------+
Bu kurulum bana verildi, bu yüzden üzerinde sınırlı bir kontrolüm var. Web sunucusu çok az CPU ve RAM kullanıyor, bu yüzden makineyi tıkanıklık olarak çıkardım. MySQL ayarlarının çoğu, otomatik yapılandırma aracından kaynaklanır.
Birkaç temsili gün boyunca PerfMon kullanarak sistemi izledim. Bundan diske takılan işletim sistemi olmadığı sonucuna varıyorum.
My.ini
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38
MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K
INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8