Etiket arşivi: Mysql

MYSQL STORED PROCEDURE DEĞİŞKEN ÖRNEĞİM

DECLARE Rand_IL int(10); /*değişken veri açılıyor*/
DECLARE Rand_ILCE int(10);/*değişken veri açılıyor*/

SET Rand_IL = (select id from iller order by rand() limit 1); /*Değişken tanımlanıyor*/
SET Rand_ILCE = (select id from ilceler where sehirid=Rand_IL order by rand() limit 1);/*Değişken tanımlanıyor*/

select Rand_IL,Rand_ILCE;/*select ile örnek veri çıkartılıyor*/

yukarıda görülen örnek rasgale il ve o ile ait ilçe idsi şeçmemize yardımcı oluyor

MYSQL BEST CONFİG

[mysqld]
old_passwords=1
set-variable=local-infile=0
skip-external-locking
skip-host-cache
skip-locking
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
safe-show-database
back_log = 75
#log-slow-queries = /var/log/mysql/mysql-slow.log
long_query_time  = 3
max_connections = 3000
key_buffer = 32M
myisam_sort_buffer_size = 64M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
read_rnd_buffer_size = 524288
table_cache = 1800
thread_cache_size = 384
interactive_timeout = 100
wait_timeout = 180
connect_timeout = 2
tmp_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
thread_concurrency = 4
query_cache_limit = 20M
query_cache_size = 16M
query_cache_type = 1
query_prealloc_size = 16384
query_alloc_block_size = 16384
low_priority_updates=1

[mysqld_safe]
open_files_limit = 8192

[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer = 64M
sort_buffer = 64M
read_buffer = 16M
write_buffer = 16M

MYSQL MİLYON VERİLER İLE SORT PERFORMANSI

Merhabalar, Mysql listeleme gibi işlemlerde veri sayısı çok fazla olunca (50-100 milyon+), sort gibi işlemlerde istediğiniz sürede veri gelemiyor,

1. Öneri Where kısımların kullandığınız tüm içerikde ikdeks gereklidir. (ÖNEMLİ UYARIMIZ)

2. Benim Önerdiğim yöntem ise

Kırmızı olan gelmesini istediğimiz sql, ortalama 5,6 saniyede çıkıyor,

bize gerekli olan alanlar IlanID,sehir,vilayet,IlanFiyati,IlanBirim,IlanAvantaji,IlanTarih,vitrin

select * from ilanlar i,(kırmızı sql) aa

dersek içerisindeki çıktı sonucunu aa sanal tablosuna sadece 25 adet veri ile aktarmış oluyor böylece sıralama işlemlerinde hızlı veri almamıza olanak sağlıyor…

where i.ilanid=aa.ilanid

kodu ile içeriden gelen veriyi i sanal tablosuna eşitlemiş oluyoruz….

select sorgumuzu şimdi böyle

select içerisinde kırmızı sql den çekmek istediğimiz sql’i aa tablosundan dış alandan ise aa ile çekiyoruz

böylece istediğimiz performansı yakalıyoruz…

select `i`.`IlanID`,
`i`.`IlanBaslik`,
`aa`.`sehir`,
`aa`.`vilayet`,
`i`.`IlanFiyati`,
`i`.`IlanBirim`,
`i`.`IlanAvantaji`,
`i`.`IlanTarih`,
`i`.`vitrin`
FROM ilanlar i,( SELECT `ilanlar`.`IlanID`,`iller`.`sehir`,`ilceler`.`vilayet`

FROM `ilanlar`,`iller`,`ilceler`
WHERE
`ilanlar`.`ilanil`=`iller`.`id` AND
`ilanlar`.`ilanilce`=`ilceler`.`id` AND `kategoriid`=1 AND

`ilanlar`.`IlanOnay`=1 AND

(`ilanlar`.`IlanBirim`=0) AND
(`ilanlar`.`q0`=1 or `ilanlar`.`q0`=2 or `ilanlar`.`q0`=3 or `ilanlar`.`q0`=4 or `ilanlar`.`q0`=5 or `ilanlar`.`q0`=6 or `ilanlar`.`q0`=7 or `ilanlar`.`q0`=8 or `ilanlar`.`q0`=9 or `ilanlar`.`q0`=10 or `ilanlar`.`q0`=11 or `ilanlar`.`q0`=12 or `ilanlar`.`q0`=13 or `ilanlar`.`q0`=14 or `ilanlar`.`q0`=15 or `ilanlar`.`q0`=16 or `ilanlar`.`q0`=17 or `ilanlar`.`q0`=18 or `ilanlar`.`q0`=19 or `ilanlar`.`q0`=20 or `ilanlar`.`q0`=21 or `ilanlar`.`q0`=22 or `ilanlar`.`q0`=23 or `ilanlar`.`q0`=24 or `ilanlar`.`q0`=25 or `ilanlar`.`q0`=26 or `ilanlar`.`q0`=27 or `ilanlar`.`q0`=28 or `ilanlar`.`q0`=29 or `ilanlar`.`q0`=30 or `ilanlar`.`q0`=31 or `ilanlar`.`q0`=32 or `ilanlar`.`q0`=33 or `ilanlar`.`q0`=34 or `ilanlar`.`q0`=35) AND
(`ilanlar`.`q1`=36 or `ilanlar`.`q1`=37 or `ilanlar`.`q1`=38 or `ilanlar`.`q1`=39 or `ilanlar`.`q1`=40 or `ilanlar`.`q1`=41 or `ilanlar`.`q1`=42 or `ilanlar`.`q1`=43) AND
(`ilanlar`.`q2`=44 or `ilanlar`.`q2`=45 or `ilanlar`.`q2`=46 or `ilanlar`.`q2`=47 or `ilanlar`.`q2`=48 or `ilanlar`.`q2`=49 or `ilanlar`.`q2`=50 or `ilanlar`.`q2`=51 or `ilanlar`.`q2`=52 or `ilanlar`.`q2`=53 or `ilanlar`.`q2`=54 or `ilanlar`.`q2`=55) AND
(`ilanlar`.`q3`=56 or `ilanlar`.`q3`=57 or `ilanlar`.`q3`=58 or `ilanlar`.`q3`=59 or `ilanlar`.`q3`=60 or `ilanlar`.`q3`=61 or `ilanlar`.`q3`=62 or `ilanlar`.`q3`=63 or `ilanlar`.`q3`=64 or `ilanlar`.`q3`=65 or `ilanlar`.`q3`=66 or `ilanlar`.`q3`=67 or `ilanlar`.`q3`=68 or `ilanlar`.`q3`=69 or `ilanlar`.`q3`=70 or `ilanlar`.`q3`=71 or `ilanlar`.`q3`=72 or `ilanlar`.`q3`=73 or `ilanlar`.`q3`=74 or `ilanlar`.`q3`=75 or `ilanlar`.`q3`=76 or `ilanlar`.`q3`=77 or `ilanlar`.`q3`=78 or `ilanlar`.`q3`=79 or `ilanlar`.`q3`=80 or `ilanlar`.`q3`=81 or `ilanlar`.`q3`=82 or `ilanlar`.`q3`=83 or `ilanlar`.`q3`=84 or `ilanlar`.`q3`=85) AND (`ilanlar`.`q4`=86 or `ilanlar`.`q4`=87 or `ilanlar`.`q4`=88 or `ilanlar`.`q4`=89 or `ilanlar`.`q4`=90 or `ilanlar`.`q4`=91 or `ilanlar`.`q4`=92 or `ilanlar`.`q4`=93 or `ilanlar`.`q4`=94 or `ilanlar`.`q4`=95 or `ilanlar`.`q4`=96 or `ilanlar`.`q4`=97 or `ilanlar`.`q4`=98 or `ilanlar`.`q4`=99 or `ilanlar`.`q4`=100 or `ilanlar`.`q4`=101 or `ilanlar`.`q4`=102 or `ilanlar`.`q4`=103 or `ilanlar`.`q4`=104 or `ilanlar`.`q4`=105 or `ilanlar`.`q4`=106 or `ilanlar`.`q4`=107 or `ilanlar`.`q4`=108 or `ilanlar`.`q4`=109 or `ilanlar`.`q4`=110 or `ilanlar`.`q4`=111 or `ilanlar`.`q4`=112 or `ilanlar`.`q4`=113 or `ilanlar`.`q4`=114 or `ilanlar`.`q4`=115) AND
(`ilanlar`.`q5`=116 or `ilanlar`.`q5`=117 or `ilanlar`.`q5`=118 or `ilanlar`.`q5`=119 or `ilanlar`.`q5`=120 or `ilanlar`.`q5`=121 or `ilanlar`.`q5`=122 or `ilanlar`.`q5`=123 or `ilanlar`.`q5`=124) AND
(`ilanlar`.`q6` BETWEEN 100 and 500) AND
(`ilanlar`.`q7`=1) ORDER BY `ilanlar`.`IlanID` DESC LIMIT 55674,25

) aa where i.ilanid=aa.ilanid

Mysql AND(ve) ve OR(veya) Komutu

Veri tabanındaki verilere sorgular uygularken ve , veya gibi komutları kullanmamız gerekebilir. AND komutu “ve” anlamına gelmektedir, OR komutu “veya” anlamına gelmektedir.
Aynı anda iki olayın da gerçekleşmesini istiyorsak veya olayların aynı anda gerçekleşmesini istiyorsak; AND komutunu kullanmalıyız. Örneğin kitap tablosunda satışta olan ve onaylı olan kitapları göstermek isteyelim;
SELECT * FROM kitap WHERE onay=’1′ AND satis_durumu=’1′;

Onay 1 olan ve satis_durumu 1 olan verileri getir demiş olduk.

Or komutu ise veya manasına gelmektedir. satışta olan veya fiyatı 15 TL olan kitapları getirmek isteyelim.


SELECT * FROM kitap WHERE fiyat=’15’ OR satis_durumu=’1′;

fiyat 15 olan veya satis_durumu 1 olan verileri getir dedik. Tablomuzda kayıtlı olan kitabın fiyatı 15 Tl olsun ve satis_durumu 0 olsun; yinede sorgumuz bu veri satırını bize getirir. Çünkü OR (veya) komutunu kullandık.

Mysql Join Uygulaması

Veri tabanı işlemlerinde bir tablodan çalışabileceğimiz gibi birden çok tablolardan veriler çekmemiz ve bu verilere belli kriterler uygulamamız gerekebilir. Uygulamalarımızda her defasında bir veriyi çekip kontorol etmek ve buna istenen kriterleri uygulamak büyük kapsamlı projelerde karmaşıklığa ve kodların yavaş çalışmasına neden olabilir.

Örnek olarak kitap tablomuz ve seçilen kitapların yer aldığı galeri tablomuz olsun. Galeri tablomuzda kitabın id si ne göre işlemler yapacağız.
Kitap tablomuzda: id, isim ve kapak sütunları yer alsın.
Galeri tablomuzda ise, id, kitap_id sutunları yer alsın.

Şimdi seçilen yani galeri tablosunda yer alan verilere göre kitapları vitrin bölümümüzde gösteren kodları yazalım.

SELECT kitap.id as  kid, kitap.isim, kitap.kapak, galeri.id as gid, galeri.kitap_id FROM kitap, galeri WHERE kitap.id=galeri.kitap_id

Yukarıdaki kod satır ; “kitap.id as kid” ile kitap tablosundaki id  sutununu kid olarak aldık,”kitap.isim” ile kitap tablosundaki isim sutununu almış olduk,”kitap.kapak” ile kitap tablosundaki kapak sutunundaki veriyi almış olduk(Kitap kapağının adının tutulmuş olduğu alan). Sıra galeri tablosundaki verileri almaya geldi. “galeri.id as gid” ile galeri tablosundaki id yi gid olarak almış olduk, “galeri.kitap_id” ile galeri tablosundaki kitap idlerinin tutulduğu bölümü çekmiş olduk. Daha sonra “WHERE kitap.id=galeri.kitap_id” ile kitap id si galeri tablosunda kitap_id sutununda yer alan yani galerimize eklenmiş olan verileri(kitapları) getir demiş olduk.
“as” kodu ile değişken tanımlamış oluyoruz.

Bu örnegimizi biraz daha geliştirerek satış içi olan ve galeride yer alan kitapları getirmek isteseydik.Satış içi olarak kitap tablomuzda durum sutununun yer aldığını farz edelim; ve durum=1 ise satış içi durum=0 ise satış dışı olsun kitabımız.
SELECT kitap.id as  kid, kitap.isim, kitap.kapak, galeri.id as gid, galeri.kitap_id FROM kitap, galeri WHERE kitap.id=galeri.kitap_id and kitap.durum=1

Yukarıdaki kod satırının en sonunda yer alan “and kitap.durum=1″ kodu ile ve kitap tablosunda durum ‘u 1 olan yani satış içi olan demiş olduk.