MySQL performans

2 Cevap java

Ben yaklaşık 900k MySQL satır ve bazı performans sorunları yaşıyorum bu LAMBASI uygulama var.

Arka plan - Apart LAMP yığından, aynı zamanda kendi JVM çalışan bir Java işlemi (multi-threaded) var. Yani birlikte LAMP & ile java, bunlar tam bir çözüm oluşturmaktadır. Java işlem ekler / güncellemeleri ve birkaç seçer sorumlu olarak iyi. Bu ekler / güncellemeler yerde 5-150 satır arasında, toplu / toplu genellikle. PHP ön-uç kod yalnızca SEÇ adlı yapar.

Sayı - java işlemi çalışırken PHP / SEÇ sorgu çok yavaş olur. Java işlemi durduğunda, en iyi performans SEÇ. Ben performans farkı çok büyük olduğu anlamına gelir. Java işlemi çalışırken, herhangi bir işlem% 80 php ön uç sonuçları üzerinde yapılmıştır ve mysqld süreçte daha fazla CPU kullanımı.

Herhangi bir yardım mutluluk duyacağız.

MySQL varsayılan parametreleri ile çalışan ve bir ayarlar.

Yazılım yığını -

  • Apache - 2.2.x
  • MySQL 5.1.37-1ubuntu5
  • PHP - 5.2.10
  • Java - 1.6.0_15
  • OS - Ubuntu 9.10 (karmik)

2 Cevap

Biz söylemek sistemi hakkında çok daha fazla bilmek gerekir diye şu normal veya nasıl sorunu çözmek için eğer.

MySQL yaklaşık 900k satır ile

Ben bunun çok küçük yapar söyleyebilirim - böylece onun kötü performans ise o zaman bir yerde ciddi yanlış gidiyoruz.

Sorguları çalışan tam olarak ne görmek için sorgu günlüğünü etkinleştirmek, sıklığı ve süresi ürün bazında önceliklendirebilir. , Açıklamak planları bir göz bazı dizinler oluşturmak. Birden çok diske veritabanını bölme düşünün.

HTH

C.

MySQL için ne motor kullanıyorsunuz? Burada dikkat edilmesi gereken şey, MyISAM kullanıyorsanız, o zaman bu motoru kullanır kilitleme nedeniyle masaya sorunları kilitleme var kalacaksın.

Gönderen: MySQL Table Locking

Table locking is also disadvantageous under the following scenario:

* A session issues a SELECT that takes a long time to run.
* Another session then issues an UPDATE on the same table. This session 
  waits until the SELECT is finished.
* Another session issues another SELECT statement on the same table.
  Because UPDATE has higher priority than SELECT, this SELECT waits for the UPDATE to finish, 
  after waiting for the first SELECT to finish.

I won't repeat them here, but the page has some tips on increasing concurrency on a table within MySQL. Obviously, one option would be to change to an engine like InnoDB which has a more complex row locking mechanism that for high concurrency tables can make a huge difference in performance. For more info on InnoDB go here. Prior to changing the engine though it would probably be worth looking at the other tips like making sure your table is indexed properly, etc. as this will increase select and update performance regardless of the storage engine.

Edit based on user comment:

I would say it's one possible solution based on the symptoms you've described, but it may not be the one that will get you where you want to be. It's impossible to say without more information. You could be doing full table scans due to the lack of indexes. This could be causing I/O contention on your disk, which just further exasterbates the table locks used by MyISAM. If this is the case then the root of the cause is the improper indexing and rectifying that would be your best course of action before changing storage engines.

Also, make sure your tables are normalized. This can have profound implications on performance especially on updates. Normalized tables can allow you to update a single row instead of hundreds or thousands in an un-normalized table. This is due to unduplicated values. It can also save huge amounts of I/O on selects as the db can more efficiently cache data blocks. Without knowing the structure of the tables you're working with or the indexes you have present it's difficult to provide you with a more detailed response.

Edit after user attempted using InnoDB:

Eğer Java süreç multi-threaded olduğundan bahsetmiştir. Tek bir iş parçacığı ile işlemini çalıştıran denediniz mi? Belki muhtemelen birden çok iş parçacığı ve / veya parçacıkları arasında güncelliyoruz yolu sorunları kilitleme neden dışarı güncelleştirmek için aynı satırları yolluyoruz eğer ben merak ediyorum.

Bunun dışında, ben şunları kontrol eder:

  1. Eğer sizin makul maliyetleri ve sorgu aslında var indeksleri kullanılarak olduğunu var doğrulamak için planlarını açıklamak kontrol ettiniz mi?
  2. Lütfen tablolar normalize edilir? Tablolar normalize olsaydı tek bir kayıt güncelleme olabilir Daha spesifik olarak, 100 satırlar güncelliyoruz?
  3. Bu Java işlemin çalıştığı ve makine içinde ve dışında yoğun takas şeyler olduğunda fiziksel bellek tükeniyor olması mümkün mü?
  4. Eğer makul işleyebilir daha fazla GİB ile disk (tek bir disk?) Sel?