MySQL'de datetime alanı dizine eklemek iyi bir fikir mi?


137

Büyük bir veritabanı tasarımı üzerinde çalışıyorum. Benim uygulamada birçok satır olacak örneğin şu anda 4 milyon kayıtları olan bir tablo var. Sorgularımın çoğu veri seçmek için datetime deyimini kullanır. Mysql veritabanında datetime alanlarını endekslemek iyi bir fikir mi?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Veritabanımın iyi çalışmasını ve sorguların sorunsuz çalışmasını sağlamaya çalışıyorum

Dahası, yüksek verimli bir veritabanı oluşturmak için hangi fikre ihtiyacım olduğunu düşünüyorsunuz?


Nedir field 20?
AlikElzin-kilaka

Yanıtlar:


164

MySQL, koşullar arasındaki satırların ortadan kaldırılması dahil çeşitli nedenlerle dizinlerin kullanılmasını önerir: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Bu, datetime sütununuzu, sorgularda sık sık kullanacaksanız, bir dizin için mükemmel bir aday yapar. Tek koşulunuz varsa ve koşulda BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)başka bir dizininiz yoksa, MySQL her sorguda tam tablo taraması yapmak zorunda kalacaktır . 30 günde kaç satır oluşturulduğundan emin değilim, ancak toplam satırların yaklaşık 1 / 3'ünden daha az olduğu sürece sütun üzerinde bir dizin kullanmak daha verimli olacaktır.

Verimli bir veritabanı oluşturma ile ilgili sorunuz çok geniştir. Sadece normalize edildiğinden ve tüm uygun sütunların dizine eklendiğinden emin olmak için söyleyebilirim (yani birleştirmelerde ve yan tümcelerde kullanılanlar).


3
Açıklama için teşekkürler. Bu gerçekten yardımcı oluyor. Eminim daha fazla filtrem olacak. Ben sadece tarih tarihini dizin olabilir datetime alanı endeksleme iyi bir fikir olup olmadığını emin olmak istiyorum. ama cevap açıkladı :) Teşekkürler
Jaylen

4
'Birleşim yerlerinde kullanılan maddeler' için +1. Bir endeksleme stratejisi için harika bir kural. Açıkçası şimdi düşünüyorum, ama daha önce bana
olmadı

1
Ancak "2017-01-01 11:20" ile "2018-01-03 12:12" arasındaki veri aralığı gibi verileri tarih aralığıyla sorgularsanız, sütunu SELECTdizine eklememe rağmen sorguyu daha hızlı hale getirmez date time. .. indeks equalişlemi kullandığımda sorgu hızlı yapmak .. Doğru mu?
user3595632

1
Datetime alanlarının DAY (datetime) veya HOUR (datetime) gibi saat işlevleriyle sorgulanmasına ne dersiniz? Dizin bu durumda yardımcı olacak mı yoksa engelleyecek mi?
cronoklee

merhaba @ Patlama Hapları, sadece yıl ve ayda tablo tabanını sorgulamak gerekirse, ben sadece yıl ve ay ile yeni bir sütun oluşturduysanız, daha sonra doğrudan datetime sütununun bir dizin oluşturmak yerine, daha iyi bir performans elde edecek ? Bu şekilde değeri 201801 gibi bir sütun oluşturuyorum.
Woods Chen

18

Burada yapılan yazar testleri, tamsayı unix zaman damgasının DateTime'dan daha iyi olduğunu göstermiştir. Not, MySql kullandı. Ama tamsayı karşılaştırarak hangi DB motoru kullanırsanız kullanın, int dizini DateTime dizininden daha iyi olduğu için tarihleri ​​karşılaştırmaktan biraz daha hızlı hissediyorum. T1 - 2 tarihi karşılaştırma zamanı, T2 - 2 tamsayıyı karşılaştırma zamanı. Dizinlenmiş alanda arama yaklaşık O (log (satırlar)) zaman alır, çünkü bazı dengeli ağaçlara dayanan indeks - farklı DB motorları için farklı olabilir, ancak yine de Log (satırlar) yaygın bir tahmindir. (bit maskesi veya r-ağacı tabanlı dizin kullanmıyorsanız). Fark (T2-T1) * Log (satırlar) - sorgunuzu sık sık gerçekleştirirseniz rol oynayabilir.


Teşekkür ederim. Bunu bir seçenek olarak düşünüyordum ama ona nasıl yaklaşacağımı bilmiyordum. Kesinlikle doğru olduğuna inanıyorum tamsayılar her zaman daha hızlıdır.
Jaylen

62
Daha iyi? Unix zaman damgasının tüm durumlar için daha iyi olduğundan şüpheliyim . Evet, bir tamsayıyı saklamak genellikle bir dizeyi saklamaktan daha hızlıdır, ancak MySQL'in ortaya koyduğu tüm DateTime işlevleri ne olacak ? Bunları kendiniz uygulamak, performans veya işlevsellik üzerinde olumsuz bir etkiye sahip olacaktır.
Greg
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.