mysql çok fazla indeks mi?


83

Mevcut veritabanımızı optimize etmek için biraz zaman harcıyorum.

Özellikle dizinlere bakıyorum.

Birkaç soru var:

  • Çok fazla dizin diye bir şey var mı?
  • Dizinler neler hızlandıracak?
  • Dizinler ne yavaşlayacak?
  • Bir dizin eklemek ne zaman iyi bir fikirdir?
  • Bir dizin eklemek ne zaman kötü bir fikirdir?
  • Pro ve Con'lar çoklu indeksler mi yoksa çok sütunlu indeksler mi?

Yanıtlar:


150

Dizinler neler hızlandıracak?

Veri alma - SELECT ifadeleri.

Dizinler ne yavaşlayacak?

Veri işleme - INSERT, UPDATE, DELETE ifadeleri.

Bir dizin eklemek ne zaman iyi bir fikirdir?

Daha iyi veri alma performansı elde etmek istediğinizi düşünüyorsanız.

Bir dizin eklemek ne zaman kötü bir fikirdir?

Yoğun veri manipülasyonu görecek tablolarda - ekleme, güncelleme ...

Pro ve Con'lar çoklu indeksler mi yoksa çok sütunlu indeksler mi?

Sorgular, bir örtme endeksi (birden fazla sütunda bir dizin) ile uğraşırken, dizin sütun tanımında soldan sağa doğru sütunların sırasını ele almalıdır. İfadedeki sütun sırasının bir önemi yoktur, yalnızca sütun 1, 2 ve 3'ünki - bir ifadenin indeks kullanılmadan önce sütun 1'e başvurması gerekir. Yalnızca sütun 2 veya 3'e bir referans varsa, 1/2/3 için örtme indeksi kullanılamaz.

MySQL'de, sorgudaki SELECT / deyim başına yalnızca bir dizin kullanılabilir (alt sorgular / vb. Ayrı bir ifade olarak görülür). Ve MySQL'in izin verdiği tablo başına alan miktarının bir sınırı vardır. Ek olarak, dizinlenmiş bir sütunda bir işlev çalıştırmak dizini işe yaramaz hale getirir - IE:

WHERE DATE(datetime_column) = ...

11
vay canına, bu bilgi gerçekten inanılmaz derecede iyi yapılandırılmış ve çok faydalı! Ve benim için en yararlı olanı, bir fonksiyonun uygulandığı bir dizinin faydasız olmasıydı ... bu cevap için teşekkür ederim!
Chris

2
@OMG, Son paragrafınızla ilgili olarak, selectdizin birleştirme nedeniyle birden fazla dizin kullanılabilir . percona.com/blog/2012/12/14/…
Pacerier

1
-1 (1) demek için sadece "SEÇİMİ" hızlandırır, SEÇME, GÜNCELLEME ve SİLME sorgularını hızlandırır, ancak indislerin "NEREDE" koşullarına göre doğru bir şekilde yaratılması, ancak veri işlemede dizinlerin güncellenmesini gerektirir; sadece INSERT sorgularının (her durumda) indekssiz olandan daha yavaş olacağı ve (2) MySQL'in bir seferde sadece bir indeks kullanabileceğini söylediği için.
Patrick Allaert

Güncelleme, silme hakkında yanıltıcı bilgiler için @PatrickAllaert -1 ile aynı
Eimsas

64

Bu sorunun bazı cevaplarına katılmıyorum.

Çok fazla dizin diye bir şey var mı?

Elbette. Sorgularınızın hiçbiri tarafından kullanılmayan dizinler oluşturmayın. Gereksiz dizinler oluşturmayın. İhtiyaç duymadığınız dizinleri keşfetmenize yardımcı olması için pt-duplicate-key-checker ve pt-index-usage gibi araçları kullanın .

Dizinler neler hızlandıracak?

  • WHERE yan tümcesinde arama koşulları.
  • Katılım koşulları.
  • Bazı ORDER BY vakaları.
  • Bazı GROUP BY durumları.
  • EŞSİZ kısıtlamalar.
  • FOREIGN KEY kısıtlamaları.
  • FULLTEXT araması.

Diğer yanıtlar, ne kadar çok dizine sahipseniz, INSERT / UPDATE / DELETE'in daha yavaş olduğunu belirtmiştir. Bu doğru, ancak birçok UPDATE ve DELETE kullanımının WHERE cümlelerine sahip olduğunu ve MySQL'de UPDATE ve DELETE'in de JOIN'leri desteklediğini düşünün. Dizinler, bu sorgulara, dizinleri güncelleme ek yükünü telafi etmekten daha fazla fayda sağlayabilir.

Ayrıca InnoDB, GÜNCELLEME veya SİLME'den etkilenen satırları kilitler. Buna satır düzeyinde kilitleme diyorlar, ancak bu gerçekten dizin düzeyinde kilitleme. Aramayı daraltacak bir dizin yoksa, InnoDB'nin değiştirdiğiniz belirli satırdan çok daha fazla satırı kilitlemesi gerekir. Tablodaki tüm satırları bile kilitleyebilir . Bu kilitler, mantıksal olarak çakışmasalar bile diğer istemciler tarafından yapılan değişiklikleri engeller.

Bir dizin eklemek ne zaman iyi bir fikirdir?

Yukarıdaki durumlardan birinde bir dizinden yararlanacak bir sorgu çalıştırmanız gerektiğini biliyorsanız.

Bir dizin eklemek ne zaman kötü bir fikirdir?

Dizin, başka bir mevcut dizinin sol önekiyse veya dizin, çalıştırmanız gereken sorguların hiçbirine yardımcı olmuyorsa.

Pro ve Con'lar çoklu indeksler mi yoksa çok sütunlu indeksler mi?

Bazı durumlarda, MySQL dizin birleştirme optimizasyonu gerçekleştirebilir ve bağımsız dizin aramalarından elde edilen sonuçları birleştirebilir veya kesiştirebilir. Ancak, tek bir dizin tanımlamak daha iyi performans sağlar, böylece dizin birleştirmenin yapılmasına gerek kalmaz.

Danışmanlık müşterilerimden biri için, indeksin bulunmadığı çoktan çoğa bir tabloda çok sütunlu bir dizin tanımladım ve birleştirme sorgusunu 94 milyon kat artırdım!

Doğru dizinleri tasarlamak, optimize etmeniz gereken sorguları temel alan karmaşık bir süreçtir . Güncellemeleri yavaşlatmamak için "her şeyi dizine ekle" veya "hiçbir şeyi dizine eklememelisiniz"

Ayrıca , Gerçekten Dizinler Nasıl Tasarlanır adlı sunumuma bakın .


10
+1 "... UPDATE ve DELETE'in birçok kullanımının WHERE cümlelerine sahip olduğunu ve MySQL'de de UPDATE ve DELETE'in JOIN'leri desteklediğini düşünün.
Rob Craig

1
Bu, güncelleme ve silme işlemlerinde dikkate alınan maddeler için kabul edilen cevap olmalıdır.
Leonardo Emilio Dominguez

1
Bu doğru cevap, doğru olarak işaretlenen cevap yanlış.
Eimsas

7

Çok fazla dizin diye bir şey var mı?

Dizinler, mevcut sorunla ilgili olarak bilgilendirilmelidir: tablolar, uygulamanızın çalıştıracağı sorgular vb.

Dizinler neler hızlandıracak?

SEÇİMLER.

Dizinler ne yavaşlayacak?

INSERT'ler daha yavaş olacaktır çünkü dizini güncellemeniz gerekir.

Bir dizin eklemek ne zaman iyi bir fikirdir?

Uygulamanız başka bir WHERE maddesine ihtiyaç duyduğunda.

Bir dizin eklemek ne zaman kötü bir fikirdir?

Benzersizlik kısıtlamalarını sorgulamak veya zorlamak için ihtiyacınız olmadığında.

Birden çok dizinin artıları ve eksileri mi yoksa çok sütunlu dizinler mi?

Soruyu anlamıyorum. Birden çok sütun içeren bir benzersizlik kısıtlamanız varsa, elbette bunu bu şekilde modelleyin.


4

Çok fazla dizin diye bir şey var mı?

Evet. Etmeyin dışarı çıkmak , indeksleri oluşturma gerektiğinde bunları oluşturmak isteyen.

Dizinler neler hızlandıracak?

Dizinler tablosu / görünümü ile ilgili herhangi bir sorgu.

Dizinler ne yavaşlayacak?

İndekslenmiş tabloya karşı herhangi bir INSERT ifadesi yavaşlatılacaktır, çünkü her yeni kaydın indekslenmesi gerekecektir.

Bir dizin eklemek ne zaman iyi bir fikirdir?

Bir sorgu kabul edilebilir bir hızda çalışmadığında. Kümelenmiş PK'nin parçası olmayan kayıtları filtreliyor olabilirsiniz; bu durumda, aradığınız filtrelere göre dizinler eklemelisiniz (performans uygun görürse).

Bir dizin eklemek ne zaman kötü bir fikirdir?

Bunu uğruna yaptığınızda - yani aşırı optimizasyon.

Pro ve Con'lar çoklu indeksler mi yoksa çok sütunlu indeksler mi?

İyileştirmeye çalıştığınız sorgulara bağlıdır.


3

Çok fazla dizin diye bir şey var mı?

Evet, her şey gibi, çok fazla dizin veri işlemeyi yavaşlatacaktır.

Bir dizin eklemek ne zaman iyi bir fikirdir?

Bir dizin eklemek için iyi bir fikir, sorgularınızın çok yavaş olduğu zamandır (yani, sorgularınızda çok fazla katılımınız olması). Performansı ayarlamak için bu optimizasyonu yalnızca sağlam bir model oluşturduktan sonra kullanmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.