sql >> Database teknologi >  >> RDS >> Mysql

Optimering af MySQL-forespørgsel for at undgå at scanne en masse rækker

Hvad får dig til at tro, at forespørgslen vil undersøge et stort antal rækker?

Forespørgslen vil scanne nøjagtigt 30 poster ved hjælp af UNIQUE indeks på tag (tag, article_id) , føj artiklen til hver post på PRIMARY KEY og stop.

Det er præcis, hvad din plan siger.

Jeg har lige lavet dette testscript:

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;

, hvor t_source er en tabel med 1M poster i den, og kør din forespørgsel:

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 øjeblikkeligt.



  1. Hvordan ændrer jeg kolonnens standardværdi i PostgreSQL?

  2. Mysql-transaktion:commit og rollback

  3. Sådan udvikler du en offline-første indbygget Android-app

  4. 4 tips til at køre SQL Server Diagnostics