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

Възможно ли е кръстосано индексиране?

Както знаете, SQLServer постига това с индексирани изгледи :

В SQLServer, за да се възползвате от тази техника, трябва да правите запитвания над изгледа, а не над таблиците. Това означава, че трябва да знаете за изгледа и индексите.

MySQL няма индексирани изгледи, но можете да симулирате поведението с таблица + тригери + индекси .

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

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

Редактирано:

Имайте предвид, че не винаги е необходимо да създавате нова таблица. Например, в тригер за връзка 1:N (главен-подробност), можете да запазите копие на поле от 'главната' таблица в таблицата 'подробности'. Във вашия случай:

CREATE TABLE tableOne (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    tableTwoId INT UNSIGNED NOT NULL,
    objectId INT UNSIGNED NOT NULL,
    desnormalized_eventTime DATETIME NOT NULL,
    INDEX (objectID),
    FOREIGN KEY (tableTwoId) REFERENCES tableTwo (id)
) ENGINE=InnoDB;

CREATE TRIGGER tableOne_desnormalized_eventTime
   BEFORE INSERT ON tableOne
for each row
begin
  DECLARE eventTime DATETIME;
  SET eventTime = 
      (select eventTime 
       from tableOne
       where tableOne.id = NEW.tableTwoId);
  NEW.desnormalized_eventTime = eventTime;
end;

Забележете, че това е тригер преди вмъкване.

Сега заявката се пренаписва, както следва:

select * from tableOne t1 
  inner join tableTwo t2 on t1.tableTwoId = t2.id
  where t1.objectId = '..'
  order by t1.desnormalized_eventTime;

Отказ от отговорност:не е тестван.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tomcat 6.0.24 Изключение:Не можа да се зареди com.mysql.jdbc.SQLError

  2. Как да направите изместването на ограничението динамично, като използвате само (My)SQL

  3. Какво е определението за мощност в SQL

  4. ALTER TABLE таблица AUTO_INCREMENT =$x

  5. Урок за MySQL – Управление на регистрационни файлове на MySQL сървър:завъртане, компресиране, запазване и изтриване