büyük veritabanı arama

4 Cevap php

Ben (URL ile ilgili birçok diğer detayları ile birlikte) bir tabloda URL tutan bir veritabanı var. Ben her linke arama yapmak için kullanmak için gidiyorum dizeleri depolayan bir tablo var. Benim veritabanı ben bağlantıları tablosunda en az 5 milyon girdileri bekliyorum, büyük olacak.

Kullanıcı ile iletişim kurar uygulama PHP ile yazılmış. Ben tüm desenleri (n X m arama) ile tüm bağlantıları üzerinden arama yapabilir ve aynı zamanda sunucu üzerinde yüksek bir yük neden olmamak ve aynı zamanda hız kaybetmemek için nasıl hakkında bazı öneriler gerekir. Ben yüksek hız ve düşük kaynaklara işletmek istiyorum. Eğer herhangi bir ipucu varsa, pseudo-kod önerileri, hepsi karşıladı.

Şu anda SQL bu aramaları gerçekleştirmek ve aynı zamanda veya tamamen PHP bunu PHP bazı yardım var komutlarını kullanmak için olup olmadığını bilmiyorum.

4 Cevap

Öncelikle ben düzeni yeniden düşünmek öneririm. Bu sadece olanları çalışır ve her desenleri değiştirmek sorgu sonuçlarını eklemek hangi bir sonuç tablo oluşturmak yerine deneyin, her kullanıcı için bu sorguyu çalıştırmak için biraz gereksiz görünüyor.

Aksi takdirde, size ihtiyacınız alanlarını ayarlayın (tam metin) indeksleri olduğundan emin olun. Sorgu kendisi için, tabloları katılabilir:

SELECT
    yourFieldsHere
FROM
    theUrlTable AS tu
JOIN
    thePatternTable AS tp ON tu.link LIKE CONCAT('%', tp.pattern, '%');

Ben oldukça kesinlikle SQL kod değil, PHP kodu bu yapmak istediğiniz söyleyebilirim. Ayrıca URL dizeleri arama yüzden belki de karma bir çeşit iyi olurdu uzun bir operasyon olacak. Birisi (google geri sonuçları bir yük getirecek) önce bu bir Zobrist karma bir varyantı kullanmak gördük.

Bu yardımcı olur umarım

Dan.

Kadar pratikte veritabanı içinde olabildiğince arıyor musunuz. Bir nxm sonuç kümesi ile biten, ve en az 5 milyon hit ile başlar iseniz, bu sadece sonuna kadar (ancak db bağlanıyorsanız, ya da soket) veri tekrar tekrar tel üzerinden Slurping gereken bir çok şey var Her zaman (bir sürü?) çoğu bunu atmadan. DB'ın yerli arama yetenekleri ('gibi maçlar, regexp, tam metin, vs ..) görev kadar olmasa bile, onlar istemci (kod) gönderilen olsun ÖNCE istenmeyen satırlar itlaf hala yararlı olacaktır .

Siz DB tabloları optimize gerekir. Bir md5 hash kullanın. Md5 ile yeni sütun, dizin ve hızlı bulundu metin kullanır.

Eğer '% text%' GİBİ kullanmak Ama eğer yardımcı yoktur.

Sphinx veya lucene kullanabilirsiniz.