2013-07-27 25 views
5

Kullanıcıların metin girebileceği bir mysql veritabanı var. Daha sonra bu metni arayabilmeleri gerekir. Mysql tam metinleri aradım ve aramaları çok daha hızlı yaptı. Bununla birlikte, şaşırtıcı bir şekilde kesici uçları daha yavaş hale getirmiştir. Ama ne kadar yavaş şaşırdım. Tek bir insert .5 - 1.5 saniye sürebilir.MySQL tam metin araması: hızlı araya ve hızlı aramaya ihtiyaç var

tablo 3 endeksli sütun vardır:

title (max length 200) 
description (max length 3000) 
content (max length 10000) 

Ben sadece sonradan ne olacağı göre bir şey değildir bu noktada tabloda yaklaşık 2000 kayıtları var.

Herhangi bir öneriniz var mı? Bu konu normal olarak nasıl ele alınır? Bir ek parçanın bu kadar uzun sürmesi normal midir?

Tam metin aramanın tüm özelliklerine ihtiyacım yok. Gerçekten sadece AND, OR, -, +, "" değerlerine ihtiyacım var. Öyleyse ağırlıklar vb. Bu endeksleme daha hızlı hale getirilebilir mi?

+7

MySQL en 'FULLTEXT' endeksleri, aslında sayesinde her zaman olduğu verilerle senkronize etmek, gerçekten tablonuza yazmayı yavaşlatır. Veritabanınıza bağlanan ve kendi dizinlerini oluşturan [Solr] (http://lucene.apache.org/solr/) veya [Sfenks] (http://sphinxsearch.com/) gibi üçüncü taraf çözümleri vardır. (veri modifikasyonundan ayrı olarak) ve dolayısıyla MySQL'in yazma performansını etkilemez. Bill Karwin'in sunumu [Full Text Search Throwdown] (http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql), seçeneklerin mükemmel bir karşılaştırmasıdır. – eggyal

+0

Sadece takılmış sfenks. Bu harika. Rt endeksleme kullanımı. Hızlı ekler ve aramalar. – user984003

cevap

2

Eggyal'in yorumuna göre cevap verin.

Sphinx'u yüklemeyi bitirdim. Bu harika. Gerçek zamanlı endekslemeyi kullanıyorum. Hızlı arama ve hızlı ekleme. Mysql free-text insert/search'den daha hızlı. Veritabanım oldukça küçük. Onlar büyük veritabanları ile hızlı gerçek zamanlı indeksleme için hileler var (2 indeks, biri eski veriler, biri yeni veri ile ayrılmış), ama buna ihtiyacım yok.

BTW: Python/Django kullanıyorum ve Sfenks kendisi dışında herhangi bir api veya kütüphane yüklemeniz gerekmez yoktu:

import MySQLdb 
connection = MySQLdb.connect(host='127.0.0.1', port = 9306) 
cursor = connection.cursor() 
cursor.execute("select id from my_index where match('stackoverflow')") 
results = cursor.fetchall() 
# I use my regular connection to insert the IDs into a table in my regular database and then join with that to get actual data.