Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Optymalizacja zapytania MySQL, aby uniknąć skanowania wielu wierszy

Co sprawia, że ​​myślisz, że zapytanie zbada dużą liczbę wierszy?

Zapytanie zeskanuje dokładnie 30 rekordy przy użyciu UNIQUE indeks na tag (tag, article_id) , dołącz artykuł do każdego rekordu w PRIMARY KEY i przestań.

To jest dokładnie to, co mówi twój plan.

Właśnie stworzyłem ten skrypt testowy:

CREATE TABLE `article` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(60) NOT NULL,
  `time_stamp` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1000001 ;

CREATE TABLE `tag` (
  `tag` varchar(30) NOT NULL,
  `article_id` int(11) NOT NULL,
  UNIQUE KEY `tag` (`tag`,`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT
INTO    article
SELECT  id, CONCAT('Article ', id), UNIX_TIMESTAMP('2011-08-17' - INTERVAL id SECOND)
FROM    t_source;

INSERT
INTO    tag
SELECT  CASE fld WHEN 1 THEN CONCAT('tag', (id - 1) div 10 + 1) ELSE tag END AS tag, id
FROM    (
        SELECT  tag,
                id,
                FIELD(tag, 'Other', 'Acer', 'Sony', 'HP', 'Dell') AS fld,
                RAND(20110817) AS rnd
        FROM    (
                SELECT  'Other' AS tag
                UNION ALL
                SELECT  'Acer' AS tag
                UNION ALL
                SELECT  'Sony' AS tag
                UNION ALL
                SELECT  'HP' AS tag
                UNION ALL
                SELECT  'Dell' AS tag
                ) t
        JOIN    t_source
        ) q
WHERE   POWER(3, -fld) > rnd;

, gdzie t_source to tabela z 1M rekordy w nim i uruchom zapytanie:

SELECT  *
FROM    tag t
JOIN    article a
ON      a.id = t.article_id
WHERE   t.tag = 'acer'
ORDER BY
        t.article_id DESC
LIMIT 30;

To było natychmiastowe.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernacyjne szyfrowanie bazy danych całkowicie przejrzyste dla aplikacji

  2. Pola daty i godziny MySQL i czas letni — jak odnieść się do dodatkowej godziny?

  3. Jak wyrazić relację ma wiele przez wiele w Entity Framework 5?

  4. Wygeneruj tabelę zamówień pogrupowanych według user_id, która sumuje ilość produktu

  5. Relacja rodzic-dziecko z pojedynczą jednostką w doktrynie 2