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

Помощ за MySQL:Оптимизиране на заявка за актуализиране, която задава класиране според реда на друга колона

Първо, бих променил budget , cost и rank_score в цяло число или друг цифров тип данни и вместо

UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;

Тогава ще използвате:

UPDATE table_name
SET rank_score = cost * 1000 + budget * 1  ;

Тогава е по-лесно, тъй като няма да се налага да се занимавате с низови функции и да имате нещо като:

SELECT * 
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC

(Скоби:с един параметър (1000 ) зададен толкова по-високо от другото (1 ) е еквивалентно на наличието на ред от cost, budget . Опитайте това, за да проверите:

SELECT * 
FROM table_name
ORDER BY cost DESC
       , budget DESC

Така че можете да премахнете rank_score всичко заедно, освен ако разбира се не планирате да правите експерименти с различни стойности на параметри.

Както посочиха други, не е най-добра практика да имате поле, което съхранява не данни, а изчисление. Това е денормализация. Вместо това поддържате таблицата нормализирана и оставяте базата данни да прави изчисленията всеки път, когато имате нужда от нея:

SELECT id, budget, cost, 
       cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC

rank_score_calculated не се съхранява в горния пример. По този начин няма да се налага да актуализирате изчисленото поле всеки път, когато се промени бюджет или цена или се добави нов ред в таблицата.

Има само един недостатък. Ако таблицата е наистина голяма и имате нужда от тази заявка (и изчислението), извършена от много потребители и много често, и таблицата се актуализира доста често, тогава това може да забави вашата база данни. В такъв случай трябва да започнете да мислите за добавяне на такова поле.

Другият случай е, когато се нуждаете от абсолютен rank във всички редове на таблицата, според вашите нужди. Тъй като MySQL няма функции за "прозорци", е много трудно да се напише такава заявка в чист SQL.)

Рангът може да се изчисли с помощта на MySQL променливи

SELECT *
     , @rownum:[email protected]+1 AS rank_calculated
FROM table_name
   , (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC

И ако искате да поставите тези стойности в rank , използвайте:

UPDATE table_name
         JOIN
         ( SELECT id
                , @rownum:[email protected]+1 AS rank_calculated
           FROM table_name
              , (SELECT @rownum:=0) AS st
           ORDER BY rank_score DESC
         ) AS r
         ON r.id = table_name.id
SET table_name.rank = r.rank_calculated ;

Горните две заявки не са чист SQL. Можете да разгледате опцията за преминаване към друга система за база данни, която поддържа прозоречни функции, като Postgres, SQL-Server или Oracle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli_query() очаква поне 2 параметъра, 1 е даден?

  2. UTF-8:показва се правилно в базата данни, но не и в HTML, въпреки набора от знаци utf-8

  3. Използвайте PHP за изхвърляне на mysql стойности в JSON файл

  4. Следвайте дизайна на таблицата с потребителска база данни

  5. Как да спра десетичното поле на MySQL да бъде закръглено?