WordPress’in SQL Performansını İncelemek

WordPress‘in yüklenme hızı çalıştırdığı SQL komutlarının tamamlanma süresiyle doğrudan ilişkilidir. Bazen hasarlı bir MySQL tablosu, bazen bozulmuş bir indeks ve bazen de yanlış kodlanmış bir eklenti MySQL performasını çok ciddi ölçülerde düşürebilir (Hatta bu durumdan dolayı hosting firmanız tarafından uyarılabilirsiniz). SQL başarımının (performans) düşmesi sayfanızın geç açılmasına neden olur. Aşağıda anlatacağım yöntem ile WordPress’in hangi SQL’leri nekadar süre ile çalıştırdığını görebileceğiz. SQL’lerin çalışma süresi bize, başarım soruna daha iyi odaklanabilmek için kılavuzluk yapacak.

Okumaya devam et “WordPress’in SQL Performansını İncelemek”

SQL ile tekrarlı kayıtları silmek

MySQL tablosundan tekrarlı kayıtların nasıl silineceği hakkında bilgi vereceğim. Tekrarlı kayıtları silmek disk alanından kazanmayı ve sorguların daha hızlı çalışmasını sağlar.

1. Yöntem

Bu yöntemde tekrarsız kayıtlar sorgulanarak yedek bir tabloya aktarılır, daha sonra ana tablo silinerek yadek tablonun adı ana tablo ile aynı yapılır. Öncelikle ana tablodan (tablo1) distinct kelimesi ile benzersiz kayıtlar listelenir. Distinct ifadesi tekrar eden kayıtları listelemez sadece birbirinden farklı kayıtlar getirilir. Geelen kayıtlar yeni bir tabloya kaydedilerek eski ktablo silinir. Sonuçta tekrarlı kayıtların ayıklandığı bir tablo elde edilmiş olur. Bu şöyle yapıyoruz:

CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1

Bu örnekte alan_adi1 isimli alana göre tekrarlı kayıtlar guruplanarak tek kayıda indirgeniyor ve dönen sonuçdan yeni_tablo isminde bir tablo oluşturuluyor. Tekrarlanan satırları tanımlamak için birden fazla alan da kullanılabilir.

CREATE TABLE yeni_tablo as SELECT * FROM eski_tablo WHERE 1 GROUP BY alan_adi1, alan_adi2, alan_adi3...

2. Yöntem

Bu kodu benim için oluşturan Emin Kadıoğlu dostuma teşekkür ederek kodu vermek istiyorum.

delete from ayrinti_tablo1 where a1no in <br/>(select a1no from (select b.a1no from ayrinti_tablo1 b where b.a1no not in <br/>(select c.a1no from ayrinti_tablo1 c group by c.atno)) as deneme);

SQL kodunu denemek için aşağıdaki veri yapısını kullanarabilirsiniz.


/*
MySQL Data Transfer
Source Host: localhost
Source Database: deneme
Target Host: localhost
Target Database: deneme
Date: 07.08.2008 18:05:56
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for ayrinti_tablo1
-- ----------------------------
CREATE TABLE `ayrinti_tablo1` (
  `a1no` int(11) NOT NULL auto_increment,
  `atno` int(11) default NULL,
  `bilgi1` varchar(100) default NULL,
  `bilgi2` varchar(100) default NULL,
  PRIMARY KEY  (`a1no`)
) ENGINE=MyISAM DEFAULT CHARSET=latin5;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `ayrinti_tablo1` VALUES ('23', '2', 'tret', null);
INSERT INTO `ayrinti_tablo1` VALUES ('27', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('28', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('29', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('22', '3', 're', null);
INSERT INTO `ayrinti_tablo1` VALUES ('31', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('26', '2', 'qwe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('30', '2', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('25', '4', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('32', '3', 'wqe', null);
INSERT INTO `ayrinti_tablo1` VALUES ('33', '2', 'wq', null);


MySQL ile bir tablonun kopyasını üretmek

Bir MySQL tablosunun üzerinde denemeler yapmadan önce onu yedeklemelisiniz. Yedek üzerinde çalışmak herzaman güzel bir davranıştır. Aşağıdaki SQL komutu ile çalışacağınız tablonun yedek olacak bir kopyasını üretebilirsiniz.

CREATE TABLE yedek_tablo SELECT * FROM asil_tablo

Eğer tablonuzda çok fazla veri varsa sadece asıl tablonun belirli satırlarından meydana gelen yedek bir tablo oluşturabilirsiniz. Bunun için aşağıdaki SQL cümlesini kullanabilirsiniz.

CREATE TABLE yedek_tablo
SELECT * FROM asil_tablo WHERE alan1='deger' LIMIT 0, 10000;

Yukarıdaki SQL’de asil_tablo’nun alan1 adlı alanında ‘deger’ verisi olan ilk 10,000 kayıt ile yedek_tablo oluşturuluyor.

SQL için ayrılmış kelime kontrolü

SQL dili her nekadar bir standartta olsa da MySQL, Oracle ve MSSQL gibi farklı veritabanı sunucularında geçerli olabilecek programcı tanımlamaları farklılıklar göstermektedir. Bir kelimenin tablo, alan veya indeks isimleri gibi kullanıcı tanımlı girdilerde kullanılıp kullanılamaycağını bilmek gerekir. Bu sayfadan bir kelimenin en çok kullanılan veritabanı sunucularında kullanılıp kullanılmadığı sorgulanabiliyor.