sql >> Databasteknik >  >> RDS >> Mysql

Optimera MySQL-fråga för att undvika att skanna många rader

Vad får dig att tro att frågan kommer att undersöka ett stort antal rader?

Frågan kommer att skanna exakt 30 poster med UNIQUE index på tag (tag, article_id) , anslut artikeln till varje post på PRIMARY KEY och sluta.

Detta är precis vad din plan säger.

Jag gjorde precis det här testskriptet:

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;

, där t_source är en tabell med 1M poster i den och kör din fråga:

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;

Det var omedelbart.



  1. Hämta gränsvärdena för en partitionerad tabell i SQL Server (T-SQL)

  2. Det gick inte att ladda drivrutinsklassen com.mysql.jdbc.Driver

  3. Uppdatera kolumner om indatavärden inte är null, annars ignorera och behåll de befintliga värdena för kolumn i databasen

  4. Finns det någon MySQL Aggregate-funktion för CONTAINS?