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

Необходим е съвет за правилно индексиране на таблица с много полета, в които да се търси

Имам таблица на работа със същото нещо, много колони и 1000 различни начина за избор. Това е кошмар. Открих обаче, че има определени комбинации от филтри, които се използват често. Това са тези, за които бих създал индекси и бих оставил другите, които рядко се използват, да работят бавно. В MSSQL мога да стартирам заявка, за да ми покаже най-скъпите заявки, които са били изпълнени към базата данни, mySQL трябва да има подобно нещо. След като ги имам, създавам индекс, който покрива колоните, за да ги ускоря. В крайна сметка ще го покриете 90 процента. Аз лично никога повече не бих проектирал подобна маса, освен ако не бях насочил AK47 към мен. (моите индекси са 3 пъти по-големи от данните в таблицата, което е много неудобно, ако трябва да добавите група или записи). Въпреки това не съм сигурен как бих препроектирал таблицата, първата ми мисъл ще бъде да разделя таблицата на две , но това би допринесло за главоболия другаде.

Потребителска таблица (потребителско име, име)

1, Lisa
2, Jane
3, John

Таблица с потребителски атрибути (UserID, AttributeName,AttributeValue)

1, EYES, Brown
1, GENDER, Female
2, EYES, Blue
2, GENDER, Female
3  EYES, Blue
3, GENDER, Male

Това би направило идентифицирането на атрибути по-бързо, но заявките ви не биха били толкова лесни за писане.

SELECT UserID, COUNT(*) as MatchingAttributes
FROM   UserAttributes 
WHERE  (UserAttributes.AttributeName = 'EYES' AND UserAttributes.AttributeValue = 'Blue') OR
       (UserAttributes.AttributeName = 'GENDER' AND UserAttributes.AttributeValue = 'Female') 

Това трябва да върне следното

UserID, MatchingAttributes
1, 1
2, 2
3, 1

Всичко, което трябва да направите тогава, е да добавите HAVING COUNT(*) =2 към заявката, за да изберете само идентификаторите, които съвпадат. Изборът е малко по-ангажиращ, но също така дава добра функция, да кажем, че филтрирате по 10 атрибута и връщате всички, които имат 10 съвпадащи. Страхотно, но кажете, че нито едно не съвпада на 100%. Може да се каже, хей, не намерих нищо, което да съвпада, но тези имаха 9 от 10 или 90% съвпадение. (просто се уверете, че ако търся синеока блондинка, не получавам съобщение, че не е намерена, но ето следващите най-близки съвпадения, съдържащи синеоки блондинки със съвпадащ резултат от 60%. Това би бъде много неудобно)

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. неуспешно отваряне на поток:няма такъв файл или директория

  2. MySQL JOIN с LIMIT 1 върху обединена маса

  3. MySQL - Каква е разликата между GROUP BY и DISTINCT?

  4. Само променливи могат да се предават чрез препратка - php

  5. Стойността на MySQL InnoDB auto_increment се увеличава с 2 вместо с 1. Вирус?