PHP ve MySQL: optimize veritabanı

6 Cevap php

Ben 10.000.000 üzerinde satır ile bir veritabanı var. Hemen şimdi sorgulama sadece bazı temel bilgileri bulmak için bir kaç saniye sürebilir. Bu benim optimize etmek için en iyi yolu, mümkün olduğu satır sayısını en aza indirmek olduğunu biliyorum, ama şimdi bunu yapmak için zaman yok, tercih değildir.

Bunu sorgularken, alınan süresi kısa böylece MySQL veritabanı optimize etmek kolay yolu nedir?

Ben gerçekten önemli bu yüzden boyutunu artırmak herhangi optimizasyonlar ince olmadığını, veritabanı boyutu hakkında umursamıyorum. Ben şu an kurmak indeksleri, optimizasyonu ile çok iyi değilim, ama ben oradan alabilirim ne kadar iyi emin değilim.

Sonunda düzgün bir veritabanı kırpmak aşağı edeceğiz, ama hızlı bir geçici çözüm var mı?

6 Cevap

Zaten ileri sürülmüştür indeksleme yanı sıra, onlar büyükse de bölümleme tabloları içine bakmak isteyebilirsiniz.

Partitioning in MySQL

Biz çok kısıtlı bilgi var çünkü, burada spesifik olmak zor, ama bölümleme ile birlikte uygun indeksleme çok uzun bir yol gidebilirsiniz. Indeksleme doğru uzun bir konu olabilir, ama bir çok genel anlamda size karşı sorgu dizin sütunları isteyeceksiniz.

Örneğin, çalışanların bir tablo var diyelim, ve SSN, FName lname Her zamanki sütun var. Bu sütunlara ek olarak, biz de tabloda bir ek 10 sütun var olduğunu söylerim.

Şimdi bu sorgu var:

SELECT FNAME, LNAME FROM EMPLOYEES WHERE SSN = 'blah';

SSN olasılıkla burada birincil anahtar olabilir ve zaten benzersiz bir dizin olabileceği gerçeğini göz ardı ederek, büyük olasılıkla sütunları içeren başka bir bileşik endeksi (SSN, FNAME, NAME oluşturarak bir performans yararı görecekti .) Bir sıralı ve küçük bir alanda gerekli tüm değerleri içerdiğinden veritabanı sadece bileşik endeksi bakarak bu sorguyu tatmin edebilir çünkü bu faydalıdır nedenidir. (Yani, daha az I / O) olduğunu. SSN üzerine dizin sadece tam tablo taraması yapmak için daha iyi bir erişim yöntemi olsa da, veritabanı hala indeksi (I / O) için veri bloklarını okumak kayıtlarına işaretçileri içerecektir değer (ler) bulmak zorundadır Fname ve lname için gerçek değerleri almak için: sorgu karşılamak için gerekli, daha sonra (daha fazla rasgele I / O olarak okunur) farklı veri blokları okumak gerekir.

Bu tabii ki çok basitleştirilmiş olduğunu, ancak bu şekilde indeksleri kullanılarak büyük ölçüde I / O azaltmak ve veritabanı performansını artırabilirsiniz.

Burada bazı diğer bağlantılar faydalı olabilir:

Eğer çok sık arama sütunlar üzerinde dizinler kullanın.

Sizin örnekte, 'x = y NEREDE', y sütun adı ise, aynı zamanda y ile bir dizin oluşturabilirsiniz.

Indeksi ile anahtar seçme sorgusu sonucu #% 3 civarında tüm tabloyu karşılaştıran ~% 5 olmalı ve daha hızlı olacaktır.

Also archieving table helps. I do not know how to do this, mostly DBA task. For DBA it is simple task if they have been doing this.

Eğer sipariş veya karmaşık sorguları yapıyorsanız çoklu sütun dizinleri kullanmanız gerekebilir. Örneğin aradığınız takdirde burada x.name = 'y' OR x.phone = 'z' bu isim, telefon üzerinde bir dizin koyarak değer olabilir. Basitleştirilmiş bir örnektir, ama bunu yapmak için gerekirse yine daha bunu araştırmak gerekir :)

Ben veritabanından 40k satır talep görebileceğiniz gibi, bu veri yükü sadece transfer edilmesi için zaman gerekir.

Ayrıca, "genel olarak geliştirmek için nasıl" sormaz. "General" optimizasyonu yolu yoktur. Optimizasyon her profil ve özel durumda araştırmanın sonucudur.

Lütfen dizinleri kullanarak sorguları mı? Ne diyeceğim bir senin seçme sorguları İZAH çalışan nedir?

İlk (ve en kolay) adım sorguları optimize emin yapacak.