Sık insert oranı ile MySQL sorgu performansını artırmak için nasıl?

3 Cevap php

Ben yaklaşık yaşıyorum. Tabloda 200K satırlar tb_post, ve her 5 dakikada yakl vardır. 10 yeni uçlar.

Ben satırları almak için aşağıdaki sorguyu kullanıyorum -

SELECT tb_post.ID, tb_post.USER_ID, tb_post.TEXT, tb_post.RATING, tb_post.CREATED_AT,
       tb_user.ID, tb_user.NAME 
FROM tb_post, tb_user 
WHERE tb_post.USER_ID=tb_user.ID 
ORDER BY tb_post.RATING DESC 
LIMIT 30

Bu sıralı şekilde tüm satırlarını fazla 10sn alıyor.

Aşağıdaki sorgu İZAH raporudur:

id select_type		table 		type 	possible_keys 	key 			key_len 	ref 		rows 		Extra
1   SIMPLE			tb_user 	ALL 	PRIMARY 		NULL 			NULL 		NULL 		20950 		Using temporary; Using filesort
1   SIMPLE			tb_post 	ref 	tb_post_FI_1 	tb_post_FI_1 	4 			tb_user.id 	4

Birkaç girişler:

  • tb_post.RATING Float tipi
  • tb_post.USER_ID üzerine dizin yok

Herkes bana bu sorgu optimize etmek ve okuma performansını artırmak gerektiği konusunda birkaç işaretçiler önerebilirsiniz?

PS: Ben veritabanı ölçekleme konularda acemi olduğum. Yani önerileri her türlü bu sorgu özgü yararlı olacaktır.

3 Cevap

Sen ORDER BY ve WHERE yan tümcesi kapsar tb_post için bir dizin gerekir.

CREATE INDEX idx2 on tb_post (rating,user_id)

=> tb_post.RATING DESC LIMIT 30 BY İZAH ... SELECT SİPARİŞ çıkış

"id";"select_type";"table";"type";"possible_keys";"key";"key_len";"ref";"rows";"Extra"
"1";"SIMPLE";"tb_post";"index";NULL;"idx2";"10";NULL;"352";""
"1";"SIMPLE";"tb_user";"eq_ref";"PRIMARY";"PRIMARY";"4";"test.tb_post.USER_ID";"1";""

Sen indeksi deneyebilirsiniz tb_post.RATING: MySQL bazen optimize etmek indeksleri kullanabilirsiniz ORDER BY hükümler: http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

Farklı tablolardan verileri bir araya çalışıyorsanız, siz de katılabileceği türünü (http://en.wikipedia.org/wiki/Join_(SQL)) istediğiniz kontrol edebilir. Bazı istediğinize bağlı olarak, diğerlerinden daha iyidir.

Eğer kapalı BY ORDER alırsak ne bir performans etkisi var mı, olur? Bu büyük bir etkiye sahiptir, o zaman belki tb_post.RATING indeksleme düşünün.

Karl