sql >> Databáze >  >> RDS >> Mysql

Optimalizace dotazu MySQL, aby se zabránilo skenování velkého množství řádků

Proč si myslíte, že dotaz prozkoumá velký počet řádků?

Dotaz bude skenovat přesně 30 záznamy pomocí UNIQUE index na tag (tag, article_id) , připojte článek ke každému záznamu na PRIMARY KEY a přestaňte.

To je přesně to, co říká váš plán.

Právě jsem vytvořil tento testovací skript:

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;

, kde t_source je tabulka s 1M záznamy v něm a spusťte dotaz:

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;

Bylo to okamžité.



  1. jak uložit indický jazyk jako telugština, hindština v databázi mysql

  2. SQL Server - Nejlepší způsob, jak získat identitu vloženého řádku?

  3. Výjimka připojení Grails a MySQL

  4. při vložení perského znaku do Oracle db vidím otazník