Ödül koyduğuna göre, zor kazanılan sırlarımı paylaşacağım ...
Genel olarak, bugün ayarladığım tüm SQL'lerin alt sorguları kullanması gerekiyordu. Oracle veritabanı dünyasından geldiğim için, kabul ettiğim şeyler MySQL ile aynı şekilde çalışmıyordu. Ve MySQL ayarlamasını okumam, sorguları optimize etme açısından MySQL'in Oracle'ın arkasında olduğu sonucuna varmamı sağlıyor.
Çoğu B2C uygulaması için gerekli olan basit sorgular MySQL için iyi çalışabilirken, Intelligence Reporting için gereken toplu raporlama türlerinin çoğu, MySQL'in onları daha hızlı yürütmesine rehberlik etmek için SQL sorgularını biraz planlama ve yeniden düzenleme gerektiriyor gibi görünüyor.
Yönetim:
max_connectionseşzamanlı bağlantıların sayısıdır. Varsayılan değer 100 bağlantıdır (5.0'dan beri 151) - çok küçük.
Not:
bağlantılar hafızayı alır ve işletim sisteminiz çok fazla bağlantıyı işleyemeyebilir.
Linux / x86 için MySQL ikili dosyaları, 4096 adede kadar eşzamanlı bağlantıya sahip olmanıza izin verir, ancak kendi kendine derlenen ikili dosyalar genellikle daha az sınırlıdır.
Table_cache'yi açık tablolarınızın ve eşzamanlı bağlantılarınızın sayısıyla eşleşecek şekilde ayarlayın. Open_tables değerini izleyin ve eğer hızla büyüyorsa boyutunu büyütmeniz gerekecektir.
Not:
Önceki 2 parametre çok sayıda açık dosya gerektirebilir. 20 + max_connections + table_cache * 2, ihtiyacınız olan şey için iyi bir tahmindir. Linux'ta MySQL'in open_file_limit seçeneği vardır, bu limiti ayarlayın.
Karmaşık sorgularınız varsa sort_buffer_size ve tmp_table_size büyük olasılıkla çok önemlidir. Değerler, sorgunun karmaşıklığına ve mevcut kaynaklara bağlı olacaktır, ancak sırasıyla 4Mb ve 32Mb önerilen başlangıç noktalarıdır.
Not: Bunlar read_buffer_size, read_rnd_buffer_size ve diğerleri arasında "bağlantı başına" değerlerdir, yani bu değer her bağlantı için gerekli olabilir. Bu nedenle, bu parametreleri ayarlarken yükünüzü ve mevcut kaynağınızı göz önünde bulundurun. Örneğin, sort_buffer_size yalnızca MySQL'in bir sıralama yapması gerekiyorsa tahsis edilir. Not: Hafızanın bitmemesine dikkat edin.
Çok sayıda bağlantı kurduysanız (yani kalıcı bağlantıların olmadığı bir web sitesi), thread_cache_size değerini sıfır olmayan bir değere ayarlayarak performansı artırabilirsiniz. 16 ile başlamak iyi bir değerdir. Thread_created çok hızlı büyümeyene kadar değeri artırın.
BİRİNCİL ANAHTAR:
Tablo başına yalnızca bir AUTO_INCREMENT sütunu olabilir, dizine alınmalıdır ve VARSAYILAN bir değere sahip olamaz
KEY normalde INDEX ile eşanlamlıdır. PRIMARY KEY anahtar özelliği, bir sütun tanımında verildiğinde sadece KEY olarak da belirtilebilir. Bu, diğer veritabanı sistemleriyle uyumluluk için uygulanmıştır.
BİRİNCİL ANAHTAR, tüm anahtar sütunlarının NOT NULL olarak tanımlanması gereken benzersiz bir dizindir.
PRIMARY KEY veya UNIQUE indeksi, tamsayı türüne sahip yalnızca bir sütundan oluşuyorsa, SELECT deyimlerinde sütuna "_rowid" olarak da başvurabilirsiniz.
MySQL'de, BİR İLK ANAHTAR'ın adı BİRİNCİL'dir
Şu anda, yalnızca InnoDB (v5.1?) Tabloları yabancı anahtarları desteklemektedir.
Genellikle, tablo oluştururken ihtiyacınız olan tüm dizinleri oluşturursunuz. PRIMARY KEY, KEY, UNIQUE veya INDEX olarak bildirilen herhangi bir sütun indekslenecektir.
NULL, "bir değere sahip olmama" anlamına gelir. NULL testi için, can not örneğin, = aritmetik karşılaştırma operatörlerini kullanın <veya <>. Bunun yerine IS NULL ve IS NOT NULL operatörlerini kullanın:
NO_AUTO_VALUE_ON_ZERO, 0 için otomatik artışı bastırır, böylece sadece NULL sonraki sıra numarasını üretir. Bu mod, bir tablonun AUTO_INCREMENT sütununda 0 depolanmışsa yararlı olabilir. (Bu arada, 0'ı saklamak tavsiye edilen bir uygulama değildir.)
Yeni satırlarda kullanılacak AUTO_INCREMENT sayacının değerini değiştirmek için:
ALTER TABLE mytable AUTO_INCREMENT = value;
veya SET INSERT_ID = değer;
Aksi belirtilmedikçe, değer 1000000 ile başlar veya şu şekilde belirtir:
...) MOTOR = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1
TIMESTAMPS:
TIMESTAMP sütunlarının değerleri, depolama için geçerli saat diliminden UTC'ye ve alma için UTC'den geçerli saat dilimine dönüştürülür.
http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
Bir tablodaki bir TIMESTAMP sütunu için geçerli zaman damgasını varsayılan değer ve otomatik güncelleme değeri olarak atayabilirsiniz.
WHERE yan tümcesinde bu türlerden birini kullanırken dikkat edilmesi gereken bir nokta, WHERE UNIX_TIMESTAMP (datecolumn) = 1057941242 yerine WHERE datecolumn = FROM_UNIXTIME (1057941242) yapmak en iyisidir. ikincisini yapmak bir dizinden yararlanmaz o sütunda.
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
UNIX_TIMESTAMP()
FROM_UNIXTIME()
UTC_DATE()
UTC_TIME()
UTC_TIMESTAMP()
MySQL'de bir tarih-
saati unix zaman damgasına dönüştürürseniz: Ve sonra ona 24 saat ekleyin:
Ve sonra onu bir tarih saatine geri dönüştürürseniz sihirli bir şekilde bir saat kaybeder!
İşte neler oluyor. Unix zaman damgasını bir tarih saatine geri dönüştürürken zaman dilimi dikkate alınır ve tam da 28-29 Ekim 2006 arasında yaz saati uygulamasından çıkıp bir saat kaybettik.
MySQL 4.1.3 ile başlayarak, CURRENT_TIMESTAMP (), CURRENT_TIME (), CURRENT_DATE () ve FROM_UNIXTIME () işlevleri, time_zone sistem değişkeninin değeri olarak kullanılabilen, bağlantının geçerli saat dilimindeki değerleri döndürür . Ek olarak, UNIX_TIMESTAMP () bağımsız değişkeninin geçerli saat dilimindeki bir tarih saat değeri olduğunu varsayar.
Geçerli saat dilimi ayarı, UTC_TIMESTAMP () gibi işlevler tarafından görüntülenen değerleri veya DATE, TIME veya DATETIME sütunlarındaki değerleri etkilemez.
NOT: YALNIZCA GÜNCELLEME , bir alan değiştirilirse DateTime'ı günceller Eğer bir GÜNCELLEME hiçbir alanın değiştirilmesine neden olmazsa, DateTime GÜNCELLEMEZ!
Ek olarak, İlk TIMESTAMP belirtilmemiş olsa bile varsayılan olarak her zaman AUTOUPDATE şeklindedir.
Dates ile çalışırken, neredeyse her zaman Julian Date'i kabul ediyorum çünkü Veri matematiği tamsayıları eklemek veya çıkarmak için basit bir mesele ve Midnight beri aynı nedenden dolayı Saniyeler. Saniyelerden daha ince ayrıntıya sahip bir zaman çözümüne ihtiyaç duyduğum nadirdir.
Bunların her ikisi de 4 baytlık bir tamsayı olarak depolanabilir ve boşluk gerçekten dar ise, işaretsiz bir tamsayı olarak UNIX zamanıyla birleştirilebilir (1/1/1970 döneminden bu yana saniyeler), bu yaklaşık 2106'ya kadar iyi olacaktır:
24 saat içinde saniye = 86400
'Signed Integer max val = 2.147.483.647 - 68 yıllık Saniyeyi tutabilir
İşaretsiz Tamsayı maks. Değer = 4,294,967,295 - 136 yıl Saniye tutabilir
İkili Protokol:
MySQL 4.1, dize olmayan veri değerlerinin dize biçimine dönüştürülmeden yerel biçimde gönderilmesine ve döndürülmesine izin veren bir ikili protokol tanıttı. (Çok kullanışlı)
Ayrıca mysql_real_query (), mysql_query () 'den daha hızlıdır çünkü ifade dizgisi üzerinde çalışmak için strlen ()' i çağırmaz.
http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
İkili protokol, sunucu tarafında hazırlanmış ifadeleri destekler ve veri değerlerinin yerel formatta iletilmesine izin verir. İkili protokol, MySQL 4.1'in önceki sürümlerinde epeyce revizyondan geçti.
Bir alanın sayısal bir türü olup olmadığını test etmek için IS_NUM () makrosunu kullanabilirsiniz. Tür değerini IS_NUM () 'a iletin ve alan sayısal ise DOĞRU olarak değerlendirilir:
Nota bir şey ikili veri olmasıdır CAN bunu kaçmak ve MySQL gerektirir hatırlamıyorsam düzenli sorgusu içinde gönderilecek yalnızca ters eğik çizgi ve tırnak karakteri öncelenmelidir söyledi. Bu, örneğin şifreli / Tuzlu parolalar gibi daha kısa ikili dizeleri EKLEMENİN gerçekten kolay bir yoludur.
Ana Sunucu:
http://www.experts-exchange.com/Database/MySQL/Q_22967482.html
http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2
HİBE REPLİKASYONU BAĞLI . slave_user 'slave_password' TARAFINDAN TANIMLANAN
#Master Binary Logging Config STATEMENT causes replication
to be statement-based - default
log-bin=Mike
binlog-format=STATEMENT
server-id=1
max_binlog_size = 10M
expire_logs_days = 120
#Slave Config
master-host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2
İkili Günlük Dosyası şöyle olmalıdır:
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/
http://dev.mysql.com/doc/refman/5.1/en/mysqlbinlog.html
http://dev.mysql.com/doc/refman/5.0/en/binary-log.html
http://dev.mysql.com/doc/refman/5.1/en/binary-log-setting.html
RESET MASTER deyimi ile tüm ikili günlük dosyalarını veya PURGE MASTER ile bunların bir alt kümesini silebilirsiniz.
--result-file = binlog.txt TrustedFriend-bin.000030
Normalleştirme:
http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html
UDF işlevleri
http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx
http://souptonuts.sourceforge.net/readme_mysql.htm
Veri tipleri:
http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html
http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2
http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/
Unutulmaması gereken bir nokta, hem CHAR hem de VARCHAR içeren karma bir tabloda mySQL'in CHAR'ları VARCHAR'lara değiştireceğidir.
RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (RecNum)
MySQL, standart SQL ve ISO 8601 spesifikasyonlarına uygun olarak tarihleri her zaman ilk yılla temsil eder
Çeşitli:
Bazı MySQl işlevlerini kapatmak, daha küçük veri dosyalarına ve daha hızlı erişime neden olacaktır. Örneğin:
--datadir veri dizinini belirleyecek ve
--skip-innodb, inno seçeneğini kapatacak ve size 10-20 milyon tasarruf sağlayacaktır
Daha fazla bilgi için
http://dev.mysql.com/tech-resources/articles/mysql-c-api.html
Bölüm 7'yi İndir - Ücretsiz
InnoDB işlemseldir, ancak onunla birlikte gelen bir performans yükü vardır. MyISAM tablolarımın% 90'ı için yeterli buldum. İşlem güvenli olmayan tabloların (MyISAM) çeşitli avantajları vardır ve bunların tümü aşağıdaki nedenlerle oluşur:
işlem ek yükü yoktur:
Çok daha hızlı
Daha düşük disk alanı gereksinimleri
Güncellemeleri gerçekleştirmek için daha az bellek gerekir
Her MyISAM tablosu diskte üç dosyada saklanır. Dosyaların tablo adıyla başlayan ve dosya türünü belirtmek için bir uzantıya sahip adları vardır. Bir .frm dosyası, tablo biçimini depolar. Veri dosyası .MYD (MYData) uzantısına sahiptir. Dizin dosyası .MYI (MYIndex) uzantısına sahiptir.
Bunlar Dosyalar olabilir zaman alıcı (böyledir Restore) 'dir MySQL Yöneticiler Yedekleme özelliği kullanmadan bozulmamış bir depolama konumuna kopyalanabilir
İşin püf noktası, bu dosyaların bir kopyasını oluşturmak ve ardından tabloyu BIRAKMAK. Dosyaları geri koyduğunuzda MySQl onları tanıyacak ve tablo takibini güncelleyecektir.
Yedeklemeniz / Geri Yüklemeniz gerekiyorsa,
Bir yedeği geri yüklemek veya mevcut bir döküm dosyasından içe aktarmak, her tablodaki dizinlerin ve birincil anahtarlarınızın sayısına bağlı olarak uzun sürebilir. Orijinal döküm dosyanızı aşağıdakilerle çevreleyerek değiştirerek bu işlemi önemli ölçüde hızlandırabilirsiniz:
SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;
.. your dump file ..
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;
Yeniden yükleme hızını büyük ölçüde artırmak için SET AUTOCOMMIT = 0 SQL komutunu ekleyin; döküm dosyasının başında ve COMMIT'i ekleyin; sonuna kadar komut.
Varsayılan olarak, autocommit açıktır, yani döküm dosyasındaki her bir ekleme komutu ayrı bir işlem olarak değerlendirilir ve bir sonraki başlatılmadan önce diske yazılır. Bu komutları eklemezseniz, büyük bir veritabanını InnoDB'ye yeniden yüklemek saatler sürebilir ...
Bir MySQL tablosundaki bir satırın maksimum boyutu 65.535 bayttır
MySQL 5.0.3'te bir VARCHAR'ın etkin maksimum uzunluğu ve on = maksimum satır boyutu (65.535 bayt)
VARCHAR değerleri depolandıklarında doldurulmaz. Takip eden boşluklar, standart SQL ile uyumlu olarak değerler depolandığında ve alındığında korunur.
MySQL'deki CHAR ve VARCHAR değerleri, sondaki boşluklara bakılmaksızın karşılaştırılır.
CHAR kullanmak, yalnızca tüm kayıt sabit boyutta ise erişiminizi hızlandıracaktır. Yani, herhangi bir değişken boyutlu nesne kullanırsanız, hepsini de değişken boyutlu yapabilirsiniz. Bir VARCHAR içeren bir tabloda CHAR kullanarak hız kazanmazsınız.
255 karakterlik VARCHAR sınırı MySQL 5.0.3 itibarıyla 65535 karaktere çıkarıldı.
Tam metin aramaları yalnızca MyISAM tabloları için desteklenir.
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
BLOB sütunlarının karakter kümesi yoktur ve sıralama ve karşılaştırma, sütun değerlerindeki baytların sayısal değerlerine dayanır
Katı SQL modu etkin değilse ve bir BLOB veya TEXT sütununa, sütunun maksimum uzunluğunu aşan bir değer atarsanız, değer sığması için kesilir ve bir uyarı oluşturulur.
Yararlı Komutlar:
katı modu kontrol edin: SELECT @@ global.sql_mode;
katı modu kapat:
SET @@ global.sql_mode = '';
SET @@ global.sql_mode = 'MYSQL40'
veya kaldır: sql-mode = "STRICT_TRANS_TABLES, ...
SÜTUNLARI GÖSTER mytable
Mytable virtualcolumnSİPARİŞİNİN sanal sütuna göre SİPARİŞİNDEN maks (ad sayısı) SEÇİN
http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html
http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id
last_insert_id ()
size mevcut iş parçacığına eklenen son satırın PK'sini verir max (pkcolname) genel olarak son PK'yi verir.
Not: Eğer tablo boşsa max (pkcolname) 1 döndürür mysql_insert_id (), yerel MySQL C API işlevinin dönüş türünü mysql_insert_id () bir long türüne (PHP'de int olarak adlandırılır) dönüştürür.
AUTO_INCREMENT sütununuzda BIGINT sütun türü varsa, mysql_insert_id () tarafından döndürülen değer yanlış olacaktır. Bunun yerine, bir SQL sorgusunda dahili MySQL SQL işlevi LAST_INSERT_ID () kullanın.
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Bir tabloya veri eklemeye çalışırken hatayı aldığınızı unutmayın:
Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’
gibi bir şey kullanmak
INSERT INTO table (this, that) VALUES ($this, $that)
Bunun nedeni, tabloya yapıştırmaya çalıştığınız değerlerin etrafında kesme işaretinin olmamasıdır. Bu nedenle kodunuzu şu şekilde değiştirmelisiniz:
INSERT INTO table (this, that) VALUES ('$this', '$that')
`` değerleri değil, MySQL alanlarını, veritabanlarını veya tablolarını tanımlamak için kullanılır;)
Sorgu sırasında sunucuyla bağlantı kesildi:
http://dev.mysql.com/doc/refman/5.1/en/gone-away.html
http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.html
http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html
http://dev.mysql.com/doc/refman/5.1/en/show-variables.html
http://dev.mysql.com/doc/refman/5.1/en/option-files.html
http://dev.mysql.com/doc/refman/5.1/en/error-log.html
Sorguları Ayarlama
http://www.artfulsoftware.com/infotree/queries.php?&bw=1313
Bence bu bonusu kazanmak için yeterli olmalı ... Harika bir ücretsiz veritabanı ile birçok saatin ve birçok projenin meyveleri . Uygulama veri sunucularını Windows platformlarında çoğunlukla MySQL ile geliştiriyorum. Düzeltmem gereken en kötü karışıklık
Eski MySQL veritabanı kabusu
Bu, tabloları burada bahsedilen birçok püf noktasını kullanarak faydalı bir hale dönüştürmek için bir dizi uygulama gerektiriyordu.
Bunu şaşırtıcı derecede yararlı bulduysanız, oy vererek teşekkürlerinizi ifade edin.
Ayrıca diğer makalelerime ve teknik incelemelerime şu adresten bakın: www.coastrd.com