MySQL veritabanı arama [kapalı]

1 Cevap php

Ben online sözlük çince sözlük (yaklaşık 300 000 satır) ile bir veritabanı tablo var. Veri yapısı bu gibi görünüyor:

 ID     ch_smpl     pinyin     definition
 ----------------------------------------
 1       我           wǒ          I, me
 2       我们         wǒmen       we, us
 etc.

PHP ve MySQL ile iyi değilim, bu yüzden soru kurulum nasıl bir arama motoru? Php mysql arama öğreticiler bir sürü buldum, ben de bazı tam metin arama örnekleri bulundu, ama Çince karakterler ile nasıl çalıştığını emin değilim. Arama hızı benim için gerçekten çok önemli.

Bu amaçla arama motoru düzenlemek konusunda herhangi bir öneri büyük takdir edilmektedir.

1 Cevap

Sizin "arama motoru" hızlı üç şey esas olarak bağlıdır:

  1. SQL Sorgulama
  2. Sizin veritabanı tasarımı
  3. Sizin MySQL yapılandırma

Yani hiçbir "bu anahtarı çevirmek ve süper kandırılan performans alırsınız" olacak. Tüm bu alanlarda mücadele etmek gerekir. Buna ek olarak performansı üzerinde bir etkisi olabilir pek çok başka şeyler vardır. Örneğin: işletim sistemi, sabit disk, bellek vs miktarı

MySQL yapılandırması ile başlayalım. Önce mysql sorgu önbelleğe alma özelliği denemek gerekir. Eğer ağırlıklı olarak okuma işlemleri varsa herşey önbelleğine gelir ve hiçbir i / o işlemleri ihtiyaç vardır çünkü bu sizin performansınızı artırabilir.

Burada okuyun: MySQL Documentation on Query Cache

Bir diğer önemli alan veritabanı tasarımı veya hangi veritabanı motoru seçmektir. Temelde üç seçeneğiniz var: InnoDB, MyISAM ve Bellek (Orada başkaları vardır ama ben onları gerçekten bilmiyorum).

Bildiğim kadarıyla MyISAM ve Bellek bildiğimiz gibi sadece masa kilitleme destek ve kilitleme satır değil. Fakat yine de, özellikle okuma işlemleri yaparsanız bu sizi etkilemez. Genel olarak, her ikisi de InnoDb daha hızlıdır. Ben olsaydım her şey bellekte tutmak beri ben Bellek ile başlamak istiyorum. Ancak etkilerinin farkında olmak: belki daha fazla bellek ihtiyacı ve sunucu çöker eğer kaydedilmemiş verileri kaybedersiniz.

InnoDB, diğer yandan size veri güvenliği bir sürü verir ve aynı zamanda oldukça hızlı, doğru yapılandırmak durumunda olabilir. Unfortunetly Bu, geniş bir alandır. Yani hepsini kapsamaz. Ile başlamak için bir şey bellek yaklaşık% 80 innodb_buffer_pool_size ayarlamaktır. Yani RAM 10GB varsa 8GB için ayarlayın.

Sunucu 8'den fazla CPU varsa, siz de daha yüksek bir sayıya innodb_thread_concurrency ayarlamak isteyebilirsiniz. Sen CPU 2 * sayısı kullanmalısınız.

MySQL performansı hakkında daha fazla bilgi edinmek istiyorsanız size bir fincan kahve kapmak ve bu blogu okumalısınız: MySQL performance blog

Bir diğer önemli şey sütunlar bazı endeksleri kullanmak olabilir. Çince sözlük bilgim ;) sınırlı olduğundan bu durumda kapalı ödeyecek Ama ben gerçekten söyleyemem

Genellikle birincil anahtar alanını konuşan bir dizin olmalıdır. Buna ek olarak sık sık sorgulamak alanlar için indisleri de kullanabilirsiniz ve o nadiren değişiklik (çekirdekler gerekir böylece endeksi geçersiz bir dizin alan her değişiklik -> performans sorunu).

Bildiğim kadarıyla aynı zamanda sütun farklı bir çok veri tutan durumda kullanılmalıdır. Örneğin sadece büyük olasılıkla sadece yarısında dizin ağacı kıracak "erkek" veya "kadın" tutan bir sütun "toplumsal cinsiyet" varsa. 100 kullanıcıları varsa 50 satır ile sona erecek. Eşsiz çoğu durumda kendi telefon numarası, bir dizin kullanmak Ama eğer, çok daha etkili olan tek bir satır ile sona erecek.

Yani belki sütununda ch_smpl için bir dizin kullanmalısınız.

Son ama en az değil, sorgu. Benim ilk tavsiyem mümkün olduğunca az veri seçmek için. Bu gibi sorguları önlemek anlamına gelir:

select * from ...

Senin durumunda: Eğer sadece bu sorguyu kullanmalısınız 我 için tanım var isterseniz:

select definition from dictionary where ch_smpl = '我'

olup

select * from dictionary where ch_smpl = '我'

Bu sütun için indeks devre dışı kalır beri Ayrıca SEARCHTERM önünde yüzde sembolü ile "gibi"-Tablolar kaçının.

Örneğin:

select * from dictionary where ch_smpl like '%我'

Sadece dönem sonra yüzde sembolü kullanmak gerekir:

select * from dictionary where ch_smpl like '我%'

Tavsiye son bir parça. Daha önce de söylediğim gibi çevirebilirsiniz özel anahtarı vardır. Eğer daha iyi bir performans elde etmek için yapabileceğiniz bir çok şey vardır. Bir kaç şey denemek ve performansını ölçmek.