Veritabanı Yönetim Sistemleri II Öğr.Gör.Kenan KILIÇASLAN kenank@beykent.edu.tr Web: http://www.kilicaslan.nom.tr 1
MySQL veritabanı
Genel MySQL, çok-kanallı (multi-threaded), çok kullanılıcılı (multi-user), hızlı ve sağlam (robust) bir veritabanı yönetim sistemidir. UNIX ve OS/2 platformları için ücretsiz dağıtılmakla birlikte Windows platformları için 30 günlük deneme sürümü sonunda lisans alınmak üzere sunulmaktadır. Kaynak kodu açık olan MySQL'in pekçok platform için binaryleri de hazır. ODBC sürücüleri de bulunuyor.
Genel Geliştiricileri, 500'den fazlası 7Milyon kayıt içeren 10,000 tablodan oluşan kendi veritabanlarını (100 gigabyte civarında veri) MySQL'de tuttuklarını söylüyorlar. MySQL, tuttuğu tablolarla, çok kullanıcılı bir sistemlerde sözkonusu olan erişim hakları sorununu çok güzel çözüyor.
Genel Negatif bir yön olarak MySQL'de transactionların desteklenmemesi, transactionların güvenliğini sağlama işini programcının üzerine yıkıyor. Ayrıca referential integrity(veri tutarlılığı) sağlama işinin programcıya bırakılması tercih edilmiş. Ancak bu bir dezavantaj olarak görülmeyebilir. Çünkü pek çok veritabanı programcısı VTYS'lerdeki referential integrity'nin esnek olmayan, zorlayıcı bir özellik olduğunu düşünmektedir.
MySQL'in Gelişimi İlk başta mSQL ile tablolarına kendi hızlı yordamları (ISAM) ile bağlanmak için işe girişmişdir. mSQL'in yeterince hızlı ve esnek olmadığı sonucuna varınca, mSQL ile aynı programlama arayüzüne (API) sahip yeni bir SQL arayüzü yazmıştır. mSQL API'sinin seçilmesinin nedeni piyasadaki kodların kolaylıkla kendi veritabanlarına aktarılabilmesidir.
MySQL'in Gelişimi "My"SQL isminin nereden geldiği tam olarak bilinmiyor. MySQL'den önce de ekip kendi yazdıkları araçlara "my" takısını ekliyordu. Öte yandan MySQL'in yaratıcısı Michael " Monty" Widenius'un kızının adı da My dır. MySQL'in sembolü olan yunusun adı 'Sakila'. İsim, dünya çapında yapılan 'Yunusa isim verin' yarışmasının sonucunda, gelen birçok önerinin arasından yazılımın geliştiricileri tarafından seçildi. Sakila, Afrika'da Swaziland'de konuşulan yerel dilden alınma bir kelimedir
Neden MySQL? Çok hızlı, güvenilir ve kullanımı kolaydır. MySQL'e Python'dan Java'ya kadar birçok programlama dili ile erişilebilir. Apache ve PHP ile beraber web-veritabanı uygulamalarında çok yaygın olarak kullanılır. Apache-PHP-MySQL üçlüsü için hazırlanmış çok geniş bir yazılım yelpazesi bulunmaktadır. Özellikle internet ortamında önem kazanan, çok esnek ve güçlü bir kullanıcı erişim kısıtlama/yetkilendirme sistemine sahiptir.
MySQL'in Bazı Özellikleri Unix türevlerinden Amiga'ya kadar birçok farklı platformda çalışabilir. Birden fazla CPU ile kolaylıkla çalışabilir. 60000'in üzerinde tablo, 5 milyarın üzerinde satır ile çalıştığı söylenen MySQL sistemler bulunmaktadır. Transaction ve/ya atomik işlem kullanan çeşitli tablo tiplerini desteklemektedir. Tabloların kontrolü, optimizasyonu ve tamiri hızlı bir biçimde yapılabilir. Windows için ODBC desteği bulunmaktadır, ODBC 2.5 komutları tamamen desteklenmektedir. Farklı karakter setlerini (iso8859-9, ...) ve onlara göre sıralama yapılmasını destekler, farklı dillerde hata mesajları verebilir. Özellikle internet ortamında önem kazanan, çok esnek ve güçlü bir kullanıcı erişim kısıtlama/yetkilendirme sistemine sahiptir.
MySQL ve Diğer Veritabanı Sunucuları MySQL gelişimi sırasında, veritabanı sunucularının yılların birikimi "gelenek"lerinin önemli bir kısmını yok saymıştır. "Olmazsa olmaz" denilen birçok özelliğin, aslında birçok durumda önemli olmadığını ortaya koymuştur. MySQL çeşitli "pratik" çözümler için geliştirilirken, diğer veritabanı sunucuları akademik düzeyde belirli kurallar ve "veritabanı bilimi" ışığında geliştirilirler. Veritabanı uygulamalarının %80'inin, SQL özelliklerinin sadece %20'lik bir kısmına gerek duyduğu ilkesi çerçevesinde geliştirilir. MySQL size farklı tablo tipleri ve işleme türleri ile esneklik sağlar. Eğer teknik olarak 'basit' bir projeniz varsa, MySQL sizin için biçilmiş kaftan olabilir. Eğer teknik olarak 'karmaşık' bir projeniz varsa, geleneksel veritabanı sunucularında yer alan gelişmiş özelliklere ihtiyaç duyabilirsiniz.
Atomik İşlem / Transaction MySQL her iki tür işlemi de desteklediği için kullanıcı, uygulamasında atomik işlemlerin hızına mı transaction özelliklerine mi ihtiyacı olduğuna karar verebilir. Seçimler tablo bazında yapılabilir. Transaction'lı tablo ile atomik işlemle çalışan tablo arasındaki en büyük fark performans konusunda oluşur. Transactionlı tablolar çalışırken daha fazla bellek, daha fazla disk alanı ve daha fazla işlemci gücü harcanır. Eğer uygulamalarınız kritik durumlarda COMMIT yapmaya değil de, ROLLBACK yapmaya göre yazıldıysa transaction kullanmak daha elverişli olabilir. Çoğunlukla kritik transactionla çalışan güncellemeler, atomik olarak çalışacak şekilde tekrar yazılabilir. Transactionların çözdüğü tüm bütünlük problemleri LOCK TABLES, INSERT DELAYED ve benzeri yöntemlerle çözülebilir.
MySQL Tablo Tipleri MySQL, iki farklı tür tablo yapısını destekler : Transaction Tabloları : InnoDB Berkeley DB Atomik İşlem Tabloları : MyISAM HEAP MERGE ISAM
Tarihçe İlk ürün : 23 May 1995 Windows version için on 8 ocak 1998 ( Windows 95 ve NT) Version 3.23: beta Haziran 2000, kararlı sürüm Ocak 2001 Version 4.0: beta Agustos 2002, kararlı sürüm Mart 2003 Version 4.1: beta Haziran 2004, kararlı sürüm Kasım 2004 Version 5.0: beta Mart 2005, kararlı sürüm Kasım 2005 (cursors, stored procedures, triggers, views, XA transactions) Sun Microsystems satın aldı MySQL AB 26 Şubat 2008
Son sürümde bulunanlar ANSI 99 SQL dili Çok platform desteği Stored procedures Triggers Cursors Views True VARCHAR desteği INFORMATION_SCHEMA
Son sürümde bulunanlar İnnoDB motoru kullanıldığında Transaction desteği SSL desteği İç içe sorgular Replikasyon. MyISAM motoru ile full-text arama Gömülü veritabanı fonksiyonları Çok dil desteği
Data Tipleri (Sayı) BIT TINYINT [UNSIGNED] [ZEROFILL] Çok küçük tamsayı. İşaretli aralık: -128 ile 127. İşaretsiz aralık: 0 ile 255. BOOL, BOOLEAN TINYINT’e benzer. Değeri sıfır ise false. Değeri sıfırdan farklı ise true’dur
Data Tipleri (Sayı) SMALLINT [UNSIGNED] [ZEROFILL] Küçük tamsayı. İşaretli aralık -32768 ile 32767. İşaretsiz aralık 0 to 65535. MEDIUMINT [UNSIGNED] [ZEROFILL] , INT [UNSIGNED] [ZEROFILL] Orta uzunlukta tamsayı. İşaretli aralık -8388608 ile 8388607. İşaretsiz aralık 0 ile 16777215. Normal uzunlukta tamsayı. İşaretli aralık -2147483648 ile 2147483647. İşaretsiz aralık 0 to 4294967295. BIGINT[(M)] [UNSIGNED] [ZEROFILL] Uzun tamsayı. İşaretsiz aralık -9223372036854775808 ile 9223372036854775807. İşaretsiz aralık: 0 ile 18446744073709551615.
Data Tipleri (Sayı) FLOAT [UNSIGNED] [ZEROFILL] küçük (single-precision) ondalıklı sayı. Kullanılabilir değer : -3.402823466E+38 ile - 1.175494351E-38 arası, 0, 1.175494351E-38 ile 3.402823466E+38 arası. DOUBLE [UNSIGNED] [ZEROFILL] , REAL[(M,D)] [UNSIGNED] [ZEROFILL] Normal uzunlukta (double-precision) ondalıklı sayı. Kullanılabilir değer : -1.7976931348623157E+308 ile - 2.2250738585072014E-308, 0, ve 2.2250738585072014E-308 ile 1.7976931348623157E+308.
Data Tipleri (Sayı) DECIMAL (M,D)] [UNSIGNED] [ZEROFILL] Parabirimi yerine kullanılır. M toplam dijit sayısı D, ondalık sayısı
Data Tipleri (Tarih) DATETIME 'YYYY-MM-DD HH:MM:SS' veya 'YY-MM-DD HH:MM:SS' formatında tarih ve saati tutar. TIMESTAMP 'YYYYMMDDHHMMSS' veya 'YYMMDDHHMMSS' formatında tarih ve saati tutar.
Data Tipleri (String) 5 bytes 'abcd' 4 bytes 'abcdefgh' 3 bytes 'ab' 'ab ' 1 byte '' ' ' Alan İhtiyacı VARCHAR(4) CHAR(4) Değer
Operatörler AND, && :Mantıksal AND BETWEEN ... AND ... : Aralığın içinde mi? &:Bitwise AND |: Bitwise OR ^:Bitwise XOR
Operatörler CASECase operator DIV(v4.1.0)Integer division /Division operator <=>NULL-safe equal to operator =Equal operator >=Greater than or equal operator >Greater than operator IS NOT NULLNOT NULL value test IS NOTTest a value against a boolean IS NULLNULL value test ISTest a value against a boolean
Operatörler LIKE: NOT BETWEEN ... AND ... !=, <>:Eşitdeğil NOT LIKE: NOT REGEXP: Negation of REGEXP NOT, ! : %: Modulo operator ||, OR : Logical OR +: Ekleme operatorü REGEXP>> XORLogical XOR
CREATE DATABASE Yazımı CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification ...] create_specification: [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
CREATE TABLE Syntax CREATE TABLE [IF NOT EXISTS] tbl_name (oluşturma özellikleri,...) [table_option ...] [partition_options]
Oluşturma Özellikleri colon_adı column_özelliği [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) [index_option ...] | {INDEX|KEY} [index_name] [index_type] (index_col_name,...) [index_option ...] | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) [index_option ...] |
Kolon tanımı data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] [reference_definition]
Data Tipleri BIT[(length)] TINYINT[(length)] [UNSIGNED] [ZEROFILL] SMALLINT[(length)] [UNSIGNED] [ZEROFILL] MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] INT[(length)] [UNSIGNED] [ZEROFILL] INTEGER[(length)] [UNSIGNED] [ZEROFILL] BIGINT[(length)] [UNSIGNED] [ZEROFILL] REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
Data Tipleri DATE TIME TIMESTAMP DATETIME YEAR
Data Tipleri CHAR(length) [CHARACTER SET charset_name] [COLLATE collation_name] VARCHAR(length) [CHARACTER SET charset_name] [COLLATE collation_name] TINYTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE collation_name] TEXT [BINARY] [CHARACTER SET charset_name] [COLLATE collation_name] MEDIUMTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE collation_name] LONGTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE collation_name]
Data Tipleri BINARY(length) VARBINARY(length) TINYBLOB BLOB MEDIUMBLOB LONGBLOB
Data Tipleri ENUM(value1,value2,value3,...) [CHARACTER SET charset_name] [COLLATE collation_name] SET(value1,value2,value3,...) [CHARACTER SET charset_name] [COLLATE collation_name]
CREATE INDEX Syntax CREATE [UNIQUE|FULLTEXT] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option ...]