Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизиране на MySQL търсене с използване на харесвания и заместващи знаци

Колко дълги са вашите струни?

Ако те са сравнително кратки (напр. английски думи; avg_len=5) и имате свободно място за съхранение на база данни, опитайте този подход:

  • За всяка дума, която искате да съхраните в таблицата, вместо това вземете всеки възможен суфикс на тази дума. С други думи, продължавате да премахвате първия знак, докато не остане нищо. Например думата value дава:
    • value
    • alue
    • lue
    • ue
    • e
  • Съхранявайте всеки от тези суфикси в базата данни.
  • Вече можете да търсите поднизове с помощта на LIKE 'alu%' (което ще намери 'alu' като част от 'value').

Съхранявайки всички суфикси, вие премахнахте необходимостта от водещ заместващ знак (позволяващ използването на индекс за бързо търсене) за сметка на място за съхранение.

Разходи за съхранение

Броят на знаците, необходими за съхраняване на дума, става word_len*word_len / 2 , т.е. квадратично по дължината на думата, на база дума. Ето коефициента на увеличение за различни размери на думите:

  • 3-буквена дума:(3*3/2) / 3 = 1.5
  • 5-буквена дума:(5*5/2) / 5 = 2.5
  • 7-буквена дума:(7*7/2) / 7 = 3.5
  • 12-буквена дума:(12*12/2) / 12 = 6

Броят на редовете, необходими за съхраняване на дума, се увеличава от 1 до word_len . Имайте предвид това режийно. Допълнителните колони трябва да бъдат сведени до минимум, за да се избегне съхраняването на големи количества излишни данни. Например номер на страница, на която първоначално е намерена думата, трябва да е добре (помислете за unsigned smallint), но обширните метаданни за думата трябва да се съхраняват в отделна таблица за всяка дума, а не за всеки суфикс.

Съображения

Има компромис в това, когато разделяме „думи“ (или фрагменти). Като пример от реалния свят:какво правим с тирета? Съхраняваме ли прилагателното five-letter като една или две думи?

Компромисът е както следва:

  • Всичко, което е разбито, не може да бъде намерено като единичен елемент. Ако съхраняваме five и letter отделно, търсейки five-letter или fiveletter ще се провали.
  • Всичко, което не счупен ще отнеме повече място за съхранение. Не забравяйте, че изискването за съхранение се увеличава квадратично в дължината на думата.

За удобство може да искате да премахнете тирето и да съхраните fiveletter . Думата вече може да бъде намерена чрез търсене на five , letter и fiveletter . (Ако премахнете тирета и от която и да е заявка за търсене, потребителите все още могат успешно да намерят five-letter .)

И накрая, има начини за съхраняване на суфиксни масиви, които не водят до големи разходи, но все още не съм сигурен дали те се превеждат добре в бази данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предотвратяване на автоматично увеличение на MySQL дубликат вмъкване

  2. Ограничение на състоянието на MySQL IN

  3. КОРЕКЦИЯ:MySQL – команда SELECT, отказана на потребителя

  4. SUBDATE() Примери – MySQL

  5. Предупреждение:mysqli_connect():(HY000/1045):Достъпът е отказан за потребител 'username'@'localhost' (използвайки парола:ДА)