Yazılım

MySQL Kurulumu Nasıl Yapılır? Ubuntu'da Güvenlik ve Performans Ayarı

Talha Aslan 15 dakikalık okuma 3 görüntülenme

MySQL kurulumu nedir ve Ubuntu'da nasıl yapılır?

MySQL kurulumu, Ubuntu ve Debian'da paket yöneticisiyle mysql-server paketini yükleyip servisi başlatmak, ardından root hesabını, kullanıcı yetkilerini ve ağ erişimini güvene almak demektir. Tek komutla bitmez. Kurulumdan sonra güvenlik betiği, yetkiler ve temel ayarlar gelir. Bu yazı MySQL kurulumu zincirini sırayla anlatır.

Önce bir not düşelim. Biz bir hosting firması değiliz, dijital pazarlama ve web ekibiyiz. Bu yüzden anlatımımız bir işletme deneyimine değil, MySQL'in resmi dokümanına ve Ubuntu'nun resmi sunucu rehberine dayanır. Emin olmadığımız bir sürüm numarasını ya da varsayılan değeri yazmıyoruz.

Yazıyı iki okur düşünerek kurduk. Birincisi web sitesi ya da e-ticaret sahibi. Hosting sağlayıcısıyla aynı dili konuşmak ve doğru soruyu sormak istiyor. İkincisi kendi VPS'ini ya da sunucusunu yöneten yazılımcı. O, adım adım komut arıyor. Her bölümde iki okur için de bir şeyler bulacaksınız.

Aynı seride MariaDB farkını, PostgreSQL'i, mysqldump ile yedeklemeyi ve Docker ile veritabanı kurulumunu ayrı yazılarda anlatıyoruz. Burada o konuları tekrar etmiyoruz, yalnızca ilgili yerlerde değiniyoruz.

MySQL kurulumunu kim yapmalı, hosting sağlayıcınıza ne zaman bırakmalısınız?

Paylaşımlı hosting ya da yönetilen sunucu kullanıyorsanız MySQL kurulumunu kendiniz yapmamalısınız. Veritabanı sunucusu zaten kurulu gelir. Siz yalnızca panelden veritabanı ve kullanıcı oluşturursunuz. Sunucu düzeyindeki ayarlara dokunmak çoğu planda zaten mümkün değildir, dolayısıyla bu yazıdaki komutlar size lazım olmaz.

Kendi VPS'inizi yönetiyorsanız durum farklı. Orada MySQL kurulumu, güvenlik ve ayar sorumluluğu sizdedir. Bu sorumluluğu üstlenmek için sunucuyu güncel tutacak, yedek alacak ve günlükleri izleyecek bir düzene ihtiyacınız var. Aksi halde en iyi ayar bile işe yaramaz.

Şu durumlarda işi hosting sağlayıcınıza ya da bir sistem yöneticisine bırakmanızı öneririz:

  • Sitenizin kesintisi doğrudan satış kaybı yaratıyor ve yedekten dönüş planınız yok.
  • Veritabanını canlı bir e-ticaret sitesinin üzerinde, test etmeden değiştirecekseniz.
  • Uzaktan erişim, güvenlik duvarı ve şifreli bağlantı gibi ağ ayarlarını ilk kez yapıyorsanız.
  • Replikasyon, kümeleme ya da büyük veri taşıma gibi geri dönüşü zor işlere girecekseniz.

Yani bu yazının amacı sizi her şeyi kendi başınıza yapmaya itmek değil. Amaç, kararı bilerek vermeniz ve yaptıracağınız işi doğru tarif etmenizdir.

Hangi MySQL paketini ve sürümünü seçmelisiniz?

Ubuntu'da depodaki mysql-server paketi en kolay yoldur. Ubuntu'nun resmi sunucu rehberi de kurulum için bu paketi gösterir. Paket, dağıtımın kendi güvenlik güncellemeleriyle gelir. Bu yüzden ilk kurulumda en az sürpriz çıkaran seçenek budur.

Sürüm numarası konusunda dürüst olalım: burada belirli bir rakam yazmıyoruz. Ne seçerseniz seçin, "güncel kararlı sürüm" ilkesini izleyin. Uzun süre destek alan bir sürümü seçmek, kısa ömürlü bir sürüme göre daha az bakım yükü getirir. Hangi sürümün hangi tarihe kadar desteklendiğini MySQL'in resmi sayfasından kontrol edin.

Debian tarafında depolar genellikle MariaDB sunar. Oracle'ın MySQL'ini istiyorsanız MySQL'in kendi paket deposunu eklemeniz gerekebilir. Bu adımın ayrıntısı sürüme göre değiştiği için resmi kurulum dokümanını açıp orada izleyin. Ayrıca MariaDB ile MySQL arasında seçim yapmak istiyorsanız farkları aynı serideki kardeş yazımızda topladık.

Uygulamanız belirli bir sürüm istiyorsa, örneğin bir CMS'in sistem gereksinimleri sayfasında yazıyorsa, önce o sayfaya bakın. Çünkü eski bir eklenti ya da tema, yeni bir sürümle uyumsuz çıkabilir.

Ubuntu'da MySQL kurulumu adım adım nasıl yapılır?

Aşağıdaki komutlar Ubuntu Server'ın resmi rehberindeki yolu izler. Önce paket listesini yenileyin, ardından paketi yükleyin. MySQL kurulumu bittiğinde servis genellikle kendiliğinden başlar. Yine de durumu kendiniz görmeniz iyi olur.

sudo apt update
sudo apt install mysql-server
sudo service mysql status
sudo ss -tap | grep mysql

İlk komut paket bilgisini tazeler. İkincisi sunucuyu yükler. Üçüncüsü servisin çalışıp çalışmadığını gösterir. Dördüncüsü MySQL'in hangi adreste dinlediğini listeler. Yani servis ayakta mı ve dışarıya açık mı sorularını tek seferde yanıtlarsınız.

İlk bağlantıyı şu komutla yaparsınız:

sudo mysql -u root

Ubuntu'nun rehberi, bu bağlantıda parola istenmediğini belirtir. Çünkü root hesabı auth_socket yöntemiyle doğrulanır. Yani işletim sistemi kullanıcınız yetkiliyse içeri girersiniz. Bu davranış güvenlidir, çünkü parola ağda dolaşmaz. Ancak uygulamanızın bu hesabı kullanmasına izin vermemelisiniz; bunu aşağıda anlatıyoruz.

Servisi yeniden başlatmanız gerekirse resmi rehber şu komutu gösterir:

sudo systemctl restart mysql.service

mysql_secure_installation ne yapar, çalıştırmalı mısınız?

mysql_secure_installation, kurulum sonrası güvenliği sıkılaştıran etkileşimli bir araçtır. MySQL'in resmi dokümanına göre root parolası belirlemenize, dışarıdan erişilebilen root hesaplarını silmenize, anonim kullanıcıları kaldırmanıza ve herkesin erişebildiği test veritabanını silmenize yardım eder. İsterseniz parola doğrulama bileşenini de etkinleştirir.

sudo mysql_secure_installation

Araç sorular sorar ve siz yanıtlarsınız. Dokümana göre varsayılan bağlantı portu 3306'dır. Ayrıca --use-default seçeneği soruları atlayıp sessiz çalışır, fakat bunu yalnızca otomatik kurulumlarda düşünün.

Peki gerçekten gerekli mi? Kısa cevap: evet, çalıştırmanızı öneririz. Çünkü araç, bir kurulumun en sık unutulan dört açığını tek oturumda kapatır. Üstelik komut kısadır ve geri dönüşü kolaydır.

Bir noktaya dikkat edin. Ubuntu'nun kendi MySQL rehberi bu aracı anmıyor. Rehber, root hesabının yerel erişimde auth_socket ile korunduğunu söylüyor. Dolayısıyla bu aracın her adımı sizin ortamınızda aynı değeri üretmeyebilir. Ekrandaki her soruyu okuyun ve root parolası gibi adımlarda ne yaptığınızı bilerek ilerleyin.

Not: Aracın tam davranışını mysql_secure_installation resmi sayfasında okuyabilirsiniz.

MySQL'de kullanıcı ve yetkiyi nasıl tanımlarsınız?

Her uygulama için ayrı bir veritabanı ve ayrı bir kullanıcı oluşturun. Böylece bir uygulamadaki açık, diğerlerine sıçramaz. MySQL'in resmi dokümanındaki söz dizimi şöyledir: önce CREATE USER ile hesabı açar, sonra GRANT ile yetki verirsiniz.

CREATE DATABASE magaza CHARACTER SET utf8mb4;
CREATE USER 'magaza_uygulama'@'localhost' IDENTIFIED BY 'guclu-bir-parola-yazin';
GRANT SELECT, INSERT, UPDATE, DELETE ON magaza.* TO 'magaza_uygulama'@'localhost';
SHOW GRANTS FOR 'magaza_uygulama'@'localhost';

Örnekteki ad ve parola uydurmadır; kendi değerlerinizi kullanın. Hesap adındaki 'localhost' kısmı, dokümana göre hesabın yalnızca aynı makineden bağlanabileceğini söyler. '%' ise her adresten bağlantıya izin veren joker karakterdir.

Burada bir ilke işe yarar: uygulamaya yalnızca gerekeni verin. Normal bir web uygulaması çoğu zaman veri okuyup yazar. Tablo silme ya da oluşturma yetkisi gerekmez. Ancak bazı kurulum sihirbazları, ilk kurulum için CREATE yetkisini ister. Bu durumda yetkiyi kurulumdan sonra geri alın.

REVOKE CREATE, DROP ON magaza.* FROM 'magaza_uygulama'@'localhost';

Yetkileri her değişiklikten sonra SHOW GRANTS ile kontrol edin. Bu alışkanlık, yanlışlıkla verilmiş geniş bir yetkiyi erken yakalamanızı sağlar.

MySQL'e uzaktan erişimi açmalı mısınız?

Çoğu web sitesi için hayır. Veritabanı ile uygulama aynı makinedeyse MySQL'in yalnızca yerel adreste dinlemesi yeterlidir. Ubuntu'nun rehberine göre bind-address ayarı /etc/mysql/mysql.conf.d/mysqld.cnf dosyasındadır. Değeri değiştirdiğinizde servisi yeniden başlatmanız gerekir.

Uzaktan erişim yalnızca iki durumda anlamlıdır. Uygulama ve veritabanı ayrı makinelerdeyse ya da bir yönetim aracıyla bağlanmanız gerekiyorsa. İkinci durumda 3306 portunu herkese açmak yerine SSH tüneli kullanmak daha güvenli bir yoldur.

ssh -L 3307:127.0.0.1:3306 kullanici@192.0.2.10

Bu komutta 192.0.2.10 bir dokümantasyon örnek adresidir. Komut, kendi bilgisayarınızdaki 3307 portunu sunucudaki MySQL'e bağlar. Böylece MySQL internete açılmaz, yönetim aracınız ise yerel porta bağlanır.

Ağ düzeyinde neyin açık olduğunu görmek için sunucunun adresini IP sorgulama aracımızla doğrulayabilir, güvenlik duvarı kurallarını ise sağlayıcınızın belgelerinden kontrol edebilirsiniz. Uzaktan erişimi açmadan önce hosting sağlayıcınıza danışmanızı öneririz. Çünkü yanlış bir kural, veritabanınızı tarayıcı botlarına açabilir.

MySQL ayar dosyası nerede, hangi dosya okunur?

MySQL başlarken seçenek dosyalarını belirli bir sırayla okur. Resmi dokümana göre Linux'ta bunlar sırasıyla /etc/my.cnf, /etc/mysql/my.cnf, varsa $MYSQL_HOME/my.cnf, --defaults-extra-file ile verdiğiniz dosya ve ~/.my.cnf dosyalarıdır. Sonra okunan dosya öncelik kazanır.

Seçenekler köşeli parantezle başlayan gruplara yazılır. Sunucu için kullanacağınız grup [mysqld] grubudur. Örneğin şöyle bir blok eklersiniz:

[mysqld]
innodb_buffer_pool_size = 2G
slow_query_log = 1

Hangi dosyaların okunduğundan emin değilseniz doküman şu komutu önerir:

mysqld --verbose --help

Çıktının başında MySQL'in aradığı dosyalar ve tanıdığı gruplar listelenir. Ubuntu'da ayarlarınızı genellikle /etc/mysql/ altındaki dosyalara yazarsınız. Ancak aynı ayarı iki yerde tanımlarsanız sonuncu kazanır. Dolayısıyla bir ayar işe yaramıyorsa önce çakışan ikinci bir tanım olup olmadığına bakın.

Dokümana göre MySQL, herkesin yazabildiği seçenek dosyalarını güvenlik gereği yok sayar. Dosya izinlerini sıkı tutun.

MySQL performans optimizasyonuna nereden başlamalısınız?

MySQL kurulumu biter bitmez ilk iş ölçüm olmalı. Ölçmeden ayar yapmayın. Performans sorunlarının büyük kısmı bellek ayarından değil, kötü yazılmış sorgudan ve eksik indeksten çıkar. Bu yüzden sıralamanız şöyle olmalı: önce yavaş sorguyu bulun, sonra indeks ve sorguyu düzeltin, en son bellek ayarına bakın.

Aşağıdaki tablo, üç katmanı ve her birinin ne zaman işe yaradığını özetler. Tablo bir karşılaştırmadır; rakam içermez, çünkü kazanç tamamen iş yükünüze bağlıdır.

KatmanNe yaparNe zaman öncelik verirsinizRisk
Yavaş sorgu günlüğüYavaş sorguları kaydederHer zaman ilk adımDüşük, yalnızca disk alanı
İndeks ve sorgu düzeltmeOkunan satırı azaltırGünlükte tekrar eden sorgu varsaYazma maliyeti biraz artar
innodb_buffer_pool_sizeVeriyi bellekte tutarVeri belleğe sığıyor ama disk okuyorsaBellek taşarsa sistem yavaşlar
Uygulama önbelleğiSorguyu hiç çalıştırmazAynı okuma çok tekrar ediyorsaEski veri gösterme riski

Son satır MySQL ayarının dışında kalır, fakat unutmamak gerekir. Aynı sonucu her istekte yeniden hesaplamak yerine önbellekten vermek çoğu zaman daha ucuzdur. Bu konuyu yazılımda önbellekleme rehberimizde ayrıca anlattık.

innodb_buffer_pool_size nedir, nasıl belirlenir?

innodb_buffer_pool_size, InnoDB'nin tablo ve indeks verisini bellekte tuttuğu alanın boyutudur. MySQL dokümanı bu alanı, erişilen verinin önbelleğe alındığı ana bellek bölgesi olarak tanımlar. Sık kullanılan veri bellekten gelir, dolayısıyla disk okuması azalır. Dokümana göre varsayılan değer 128 MB'tır.

Peki ne kadar vermelisiniz? Resmi doküman şöyle der: ayrılmış sunucularda fiziksel belleğin yüzde 80'ine kadarı sıklıkla buffer pool'a verilir. Burada iki kelimeye dikkat edin: "kadar" ve "ayrılmış". Bu bir tavandır, hedef değildir. Üstelik yalnızca veritabanına ayrılmış makineler için geçerlidir.

Web sunucusu, PHP ve veritabanı aynı makinedeyse işletim sistemine, PHP süreçlerine ve bağlantılara da bellek bırakmalısınız. Örnek hesap: 8 GB belleği olan paylaşımlı bir makinede, yüzde 80 tavanı yaklaşık 6,4 GB eder. Ancak PHP ve işletim sistemi bunun büyük kısmını isteyeceği için daha düşük bir değerle başlar, bellek kullanımını izler ve gerekirse artırırsınız. Bu bir başlangıç yaklaşımıdır, garanti değildir.

Kalıcı değeri seçenek dosyasına yazarsınız:

[mysqld]
innodb_buffer_pool_size = 2G

Buradaki 2G yalnızca örnektir. Veri boyutunuza ve belleğinize göre kendi değerinizi belirleyin.

innodb_buffer_pool_size değerini canlıda değiştirebilir misiniz?

Evet, MySQL dokümanına göre buffer pool boyutunu sunucuyu yeniden başlatmadan değiştirebilirsiniz. Bunun için SET GLOBAL komutu yeterlidir. Ancak değer, innodb_buffer_pool_chunk_size ile innodb_buffer_pool_instances çarpımının katı olmak zorundadır. Aksi halde MySQL değeri en yakın geçerli katına yukarı yuvarlar.

SELECT @@innodb_buffer_pool_size;
SET GLOBAL innodb_buffer_pool_size = 2147483648;
SHOW STATUS WHERE Variable_name = 'Innodb_buffer_pool_resize_status';

Üçüncü komut yeniden boyutlandırmanın durumunu gösterir. Doküman ayrıca, işlem başlamadan önce etkin işlemlerin bitmesi gerektiğini söyler. Dolayısıyla yoğun bir saatte değişiklik yapmak, beklemeye yol açabilir.

Bir uyarı daha var. Dokümana göre chunk sayısı, yani buffer pool boyutunun chunk boyutuna oranı, performans sorunu yaşamamak için 1000'i aşmamalıdır. Küçük sunucularda bu sınıra yaklaşmazsınız, fakat çok büyük bellekte kontrol etmek gerekir.

SET GLOBAL yalnızca çalışan sunucuyu etkiler. Yeniden başlatmadan sonra değer, seçenek dosyasındaki değere döner. Bu yüzden kalıcı olmasını istediğiniz değeri my.cnf dosyasına da yazın. Üretim ortamında bu işi saatler önce planlamak, olası bir bekleme anında sizi rahatlatır.

Ayrıntılar için buffer pool yeniden boyutlandırma sayfasına ve buffer pool genel bakışına göz atın.

MySQL yavaş sorgu günlüğü nasıl açılır?

Yavaş sorgu günlüğü, belirli bir süreyi aşan sorguları dosyaya yazar. MySQL dokümanına göre slow_query_log varsayılan olarak kapalıdır ve long_query_time varsayılan olarak 10 saniyedir. Yani hiçbir şey yapmazsanız, sorgunuz ancak 10 saniyeyi aşınca kayda girer. Çoğu web sitesi için bu eşik fazla yüksektir.

Çalışan sunucuda geçici olarak açmak için şu komutları kullanırsınız:

SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 1;

Dosya yolu ve 1 saniyelik eşik örnektir. MySQL'in süreci o dizine yazabilmelidir; yazamazsa günlük oluşmaz. Eşik değerini sitenizin hızına göre seçin. Önce yüksek bir eşikle başlayıp aşağı çekmek, günlüğü şişirmemenizi sağlar.

Kalıcı yapmak için aynı üç satırı [mysqld] grubuna yazın. SET GLOBAL ile yaptığınız ayar, yeniden başlatmadan sonra kaybolur.

Dokümandaki log_queries_not_using_indexes seçeneği, indeks kullanmayan sorguları süreden bağımsız kaydeder. Ancak küçük tablolarda indeks kullanmamak normal olabilir. Bu yüzden günlüğü kısa sürede doldurur. Genelde önce yalnızca süre eşiğiyle başlamak daha okunaklıdır.

Yavaş sorgu günlüğünü nasıl okursunuz?

Günlük dosyası uzadıkça elle okumak zorlaşır. MySQL, bunun için mysqldumpslow adında bir özetleme aracı sunar. Araç benzer sorguları gruplar, kaç kez çalıştıklarını ve ne kadar sürdüklerini gösterir. Böylece tek seferlik yavaşlıkla sürekli tekrar eden yavaşlığı ayırt edersiniz.

mysqldumpslow /var/log/mysql/mysql-slow.log

Önce şu soruyu sorun: hangi sorgu en çok toplam süreyi harcıyor? Tek bir ağır sorgu ile bin kez çalışan orta ağırlıktaki sorgu farklı çözümler ister. Birincisini indeksle ya da yeniden yazarak, ikincisini önbellekle ya da uygulama kodunu düzelterek çözersiniz.

Günlükte karşınıza çıkan sorguyu kopyalayıp doğrudan EXPLAIN ile inceleyin. Bunu aşağıda anlatıyoruz. Unutmayın, günlük kişisel veri içerebilir; sorgu metinleri parametre değerlerini taşıyabilir. Dosyayı herkese açık bir dizine koymayın ve paylaşmadan önce temizleyin.

Ayrıntı için yavaş sorgu günlüğü sayfasını okuyun.

İndeks nedir, ne zaman işe yarar?

İndeks, tablodaki satırlara daha hızlı ulaşmanızı sağlayan ek bir veri yapısıdır. Kitabın sonundaki dizin gibi düşünün. Dizin olmasa aradığınız kelime için bütün kitabı okursunuz. MySQL de indeks yoksa tabloyu satır satır tarar.

Bir sütunda WHERE, JOIN ya da ORDER BY ile sık arama yapıyorsanız o sütun indeks adayıdır. Örneğin bir e-ticaret sitesinde sipariş tablosunu müşteri koduna göre sürekli sorguluyorsanız, müşteri kodu sütununa indeks koyarsınız.

CREATE INDEX idx_siparis_musteri ON siparis (musteri_id);
SHOW INDEX FROM siparis;

Ancak indeks bedava değildir. Her yazma işleminde indeks de güncellenir, üstelik disk alanı tutar. Çok sayıda gereksiz indeks, yazma hızını düşürür. Bu yüzden her sütuna indeks koymayın, günlükte gördüğünüz gerçek sorgulara göre ekleyin.

Bir not daha: değeri çok az çeşitlilik gösteren bir sütun, yani yalnızca birkaç farklı değeri olan sütun, çoğu zaman iyi bir indeks adayı değildir. Ayrıca bileşik indekste sütun sırası önemlidir; dokümana göre MySQL bazı durumlarda anahtarın yalnızca soldaki öneki kullanır.

SQL'i ilk kez öğreniyorsanız SQL öğrenme rehberimiz, mülakat için ise SQL mülakat soruları yazımız iyi bir başlangıçtır.

EXPLAIN çıktısını nasıl okursunuz?

EXPLAIN, MySQL'in bir sorguyu nasıl çalıştıracağını gösterir. Sorguyu çalıştırmadan önce başına EXPLAIN yazarsınız. Doküman, bu ifadenin SELECT, DELETE, INSERT, REPLACE ve UPDATE için çalıştığını belirtir. Çıktıda hangi indeksin seçildiğini ve kaç satır bakılacağını görürsünüz.

EXPLAIN SELECT * FROM siparis WHERE musteri_id = 42;

Çıktının en önemli sütunları şunlardır:

  • type: tablonun nasıl okunduğunu söyler. ALL tam tablo taramasıdır.
  • possible_keys: kullanılabilecek indeksleri listeler.
  • key: MySQL'in gerçekten seçtiği indeksi gösterir.
  • rows: MySQL'in incelemesi gereken satır sayısı tahminidir.
  • Extra: ek bilgi verir; Using filesort ve Using temporary dikkat çeker.

Doküman, ALL için tam tablo taramasının normalde iyi olmadığını, çoğu durumda çok kötü olduğunu söyler. Hedefiniz, büyük tablolarda type değerinin ALL'dan uzaklaşıp ref, range ya da const gibi indeks kullanan değerlere dönmesidir.

rows sütununa güvenirken dikkatli olun. Dokümana göre InnoDB tablolarında bu sayı bir tahmindir ve her zaman kesin olmayabilir. Bu yüzden tek bir rakamı mutlak doğru saymayın; önce ve sonra değerlerini karşılaştırın.

EXPLAIN'de hangi değerler uyarı sayılır?

Tablo, en sık karşılaşacağınız değerleri ve ne anlama geldiklerini toplar. Anlamlar MySQL'in EXPLAIN çıktı sayfasına dayanır.

DeğerAnlamıNe yaparsınız
type = ALLTam tablo taramasıBüyük tabloda ise indeks ekleyin ya da sorguyu değiştirin
type = rangeİndeksle belirli bir aralığı okurGenellikle yeterlidir, satır sayısına bakın
type = refEşleşen indeks değerlerini okurÇoğu zaman iyi sinyaldir
type = constEn çok bir satır eşleşirİdeal durumdur
Using filesortSıralama için ek geçiş yaparORDER BY için uygun indeks düşünün
Using temporaryGeçici tablo kurarSorguyu ya da GROUP BY'ı gözden geçirin
Using indexYalnızca indeksten okurİyi sinyaldir

Doküman, Using filesort ve Using temporary değerlerini sorguları olabildiğince hızlı istiyorsanız dikkat etmeniz gereken işaretler olarak anar. Ancak küçük bir tabloda bunlar sorun yaratmayabilir. Bu nedenle değerleri satır sayısıyla birlikte yorumlayın.

Örnek bir akış şöyledir. Günlükte siparişleri müşteriye göre listeleyen sorguyu buldunuz. EXPLAIN type = ALL ve yüksek bir rows tahmini gösteriyor. İndeksi eklersiniz, EXPLAIN'i yeniden çalıştırırsınız ve type değerinin ref'e döndüğünü görürsünüz. Böylece iyileşmeyi kanıtlamış olursunuz.

Sorgunun gerçek süresini görmek isterseniz MySQL'in EXPLAIN ANALYZE seçeneği de var. Fakat bu seçeneğin ayrıntılarını biz resmi sayfada doğrulamadık, o yüzden kullanmadan önce kendi sürümünüzün dokümanına bakın. EXPLAIN'in sütunlarını EXPLAIN çıktı sayfasında tek tek bulabilirsiniz.

MariaDB ile mi kurmalısınız?

Bu yazıdaki SQL ifadelerinin büyük kısmı MariaDB'de de çalışır, fakat her ayar adı ve varsayılan değer aynı olmayabilir. Bu nedenle MariaDB kullanıyorsanız komutları kendi sürümünüzün dokümanıyla doğrulayın. Farkları ayrı bir yazıda, MariaDB ile MySQL karşılaştırmasında topladık.

Karar verirken şu soruya bakın: uygulamanız hangisini istiyor? Birçok CMS ikisini de destekler. Hosting sağlayıcınız hangisini sunuyorsa genellikle onunla gitmek en az sorunu çıkarır. Bu seçim tek başına siteyi hızlandırmaz; indeks ve sorgu kalitesi çoğu zaman daha belirleyicidir.

MySQL ayarı site hızını ve SEO'yu nasıl etkiler?

Dinamik bir sayfa, yanıtı üretmek için veritabanına sorgu gönderir. Sorgu yavaşsa sunucunun ilk yanıt süresi uzar. Bu da sayfanın açılışını geciktirir. Kullanıcı bekler, arama motoru da yavaş siteyi tarama ve deneyim açısından daha az sever. Bu ilişkiyi site hızı SEO'yu nasıl etkiler yazımızda ayrıntılı anlattık.

E-ticarette etki daha doğrudan görünür, çünkü ürün listesi, filtre ve sepet sayfaları çok sorgu çalıştırır. Bu konudaki etkiyi e-ticarette sayfa hızı yazımızda ele aldık. Sayfanın hız karnesini görmek için Lighthouse ile performans testi iyi bir başlangıçtır.

Ancak şunu unutmayın: Lighthouse tarayıcı tarafını ölçer. Yavaş bir veritabanı sorgusunu doğrudan göstermez, yalnızca sunucu yanıt süresi olarak yansır. Bu yüzden asıl suçluyu bulmak için yavaş sorgu günlüğüne bakmanız gerekir.

Siteniz özel yazılımsa, veritabanı tasarımı ve sorgu kalitesi geliştirme aşamasında belirlenir. Böyle bir proje için özel yazılım geliştirme hizmetimize göz atabilir, mevcut sitenizin hız sorununu SEO danışmanlığı çerçevesinde birlikte inceleyebiliriz.

MySQL kurulumunda en sık yapılan hatalar hangileridir?

MySQL kurulumunda hataların çoğu bilgisizlikten değil, aceleden çıkar. Aşağıdaki liste, sık görülen hataları ve basit önlemlerini toplar.

  • Uygulamayı root hesabıyla bağlamak: her uygulamaya ayrı kullanıcı verin.
  • 3306 portunu herkese açmak: yerel dinleme ve SSH tüneliyle başlayın.
  • Ölçmeden buffer pool büyütmek: önce yavaş sorgu günlüğüne bakın.
  • Her sütuna indeks koymak: yalnızca günlükte görünen sorgulara indeks ekleyin.
  • Yedek almamak: ayarları değiştirmeden önce mutlaka yedek alın.
  • Ayarı iki dosyada tanımlamak: çakışmayı mysqld --verbose --help ile kontrol edin.

Yedek konusu ayrı bir başlıktır. Yedekleme stratejisini web sitesi yedekleme stratejisi yazımızda, veritabanı özelinde mysqldump kullanımını ise serideki kardeş yazımızda anlatıyoruz. Veritabanı, sitenin en değerli parçasıdır; yedeksiz yapılan her değişiklik bir risktir.

Hosting seçimi de bu kararın parçasıdır. Hangi planın veritabanı ayarlarına izin verdiğini öğrenmek için hosting seçme rehberimize bakın.

MySQL kurulumundan sonra hangi kontrol listesini izlemelisiniz?

Kurulum bittiğinde aşağıdaki sırayı izleyin. Her adım, bir önceki adımın başarılı olduğunu varsayar. Listeyi bir kez uygulayın, ardından üç ayda bir tekrar gözden geçirin.

  1. Servisin çalıştığını ve hangi adreste dinlediğini doğrulayın.
  2. mysql_secure_installation adımlarını okuyarak uygulayın.
  3. Her uygulama için ayrı veritabanı ve kullanıcı oluşturun.
  4. Yetkileri SHOW GRANTS ile kontrol edin.
  5. Uzaktan erişim gerekmiyorsa kapalı tutun.
  6. Yavaş sorgu günlüğünü makul bir eşikle açın.
  7. Günlükteki ilk üç sorguyu EXPLAIN ile inceleyin.
  8. Gerekirse indeks ekleyin ve sonucu yeniden ölçün.
  9. Buffer pool boyutunu bellek kullanımınıza göre ayarlayın.
  10. Yedeği alın ve geri yüklemeyi bir kez deneyin.

Bu listenin amacı, işin sırasını göstermektir. Her madde kendi başına bir konu olabilir, fakat sıra önemlidir. Güvenlik ve yedek önce, hız ayarı sonra gelir.

Kendi başınıza ilerlemekten emin değilseniz bu işi sorumluluğu belli bir uzmana bırakmak akıllıca olur. Biz sunucu işletmiyoruz; ancak web sitenizin hız ve görünürlük sorunlarını birlikte çözmek için web tasarım hizmetimizi ve e-ticaret danışmanlığımızı sunuyoruz.

Sıkça Sorulan Sorular

MySQL kurulumu ne kadar sürer?
Paket kurulumu genellikle birkaç dakika sürer, ancak asıl zaman kurulumdan sonraki adımlara gider. Güvenlik betiğini çalıştırmak, kullanıcı ve yetki tanımlamak, ayar dosyasını düzenlemek ve ilk yedeği almak için ayrıca zaman ayırmalısınız. Ayrıca acele edip bu adımları atlarsanız, ileride veri kaybı ve güvenlik sorunlarıyla uğraşabilirsiniz. Bu yüzden takvime en az yarım gün koymanızı öneririz.
MySQL kurulumunda root parolası şart mı?
Ubuntu'nun resmi sunucu rehberine göre root hesabı yerel bağlantıda auth_socket ile doğrulanır ve parola istemez. Bu davranış yerel erişim için güvenlidir. Ancak uygulamanızın root hesabını kullanmasına izin vermeyin. Bunun yerine her uygulama için ayrı kullanıcı oluşturun, güçlü bir parola verin ve yalnızca gereken yetkileri tanımlayın.
innodb_buffer_pool_size için en iyi değer nedir?
Herkese uyan tek bir değer yoktur, çünkü bellek ve veri boyutu her sitede farklıdır. MySQL dokümanı, ayrılmış sunucularda fiziksel belleğin yüzde 80'ine kadarının sıklıkla verildiğini söyler. Web sunucusu ve PHP aynı makinedeyse daha düşük bir değerle başlayın, bellek kullanımını izleyin ve gerekirse artırın. Varsayılan değer 128 MB'tır, çoğu gerçek site için küçüktür.
Yavaş sorgu günlüğü siteyi yavaşlatır mı?
Günlük, yalnızca eşiği aşan sorguları dosyaya yazar, bu yüzden normal şartlarda yükü düşüktür. Ancak eşiği çok düşürür ya da log_queries_not_using_indexes seçeneğini açarsanız dosya hızla büyüyebilir. Eşiği makul seçin, dosyanın disk alanını izleyin ve incelemeniz bitince eşiği yeniden yükseltmeyi düşünün.
EXPLAIN sorguyu gerçekten çalıştırır mı?
Normal EXPLAIN, MySQL'in sorguyu nasıl çalıştıracağını gösterir ve yürütme planını açıklar. Çıktıdaki rows sütunu bir tahmindir, kesin sonuç değildir. Bu nedenle bir değişikliğin işe yaradığını anlamak için indeksi eklemeden önce ve sonra planı karşılaştırın, ayrıca yavaş sorgu günlüğündeki gerçek süreyi de kontrol edin.
MySQL'i kendim mi kurmalıyım, hosting mi kurmalı?
Paylaşımlı hosting ya da yönetilen sunucuda veritabanı sunucusu hazır gelir; siz yalnızca panelden veritabanı açarsınız. Kendi VPS'inizde güvenlik, güncelleme, izleme ve yedek sorumluluğu size ait olur. Bunları sürdürebileceğinizden emin değilseniz, işi sağlayıcınıza ya da bir sistem yöneticisine bırakmak daha güvenlidir.
  • mysql kurulumu
  • ubuntu mysql
  • mysql performans
  • innodb buffer pool
  • yavaş sorgu günlüğü
  • mysql explain
  • mysql indeks
  • veritabanı optimizasyonu
Paylaş:
Talha Aslan

Google Partner dijital pazarlama uzmanı. 2012’den beri SEO, Google Ads, web tasarım ve e-ticaret projelerinde sahada; bu blogda gördüğünüz her yazı o deneyimden çıkar.

Sıradaki proje

Projenizi konuşalım.

Talebiniz doğrudan Talha Aslan ve ekibine ulaşır: stratejiyi Talha kurar, uygulamayı deneyimli ekip yürütür. İlk istişare ücretsizdir; hedefinizi dinler, net bir yol haritasıyla döneriz.