sql >> Database >  >> RDS >> Mysql

MySQL-query optimaliseren om te voorkomen dat veel rijen worden gescand

Waarom denkt u dat de zoekopdracht een groot aantal rijen zal onderzoeken?

De zoekopdracht scant precies 30 records met behulp van de UNIQUE index op tag (tag, article_id) , voeg het artikel toe aan elk record op PRIMARY KEY en stop.

Dit is precies wat je plan zegt.

Ik heb zojuist dit testscript gemaakt:

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;

, waar t_source is een tabel met 1M records erin en voer uw zoekopdracht uit:

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;

Het was meteen.



  1. Waarom mislukt mijn ODBC-verbinding bij het uitvoeren van een SSIS-belasting in Visual Studio, maar niet bij het uitvoeren van hetzelfde pakket met het hulpprogramma Pakket uitvoeren

  2. Een tekenreeks in omgekeerde volgorde retourneren met SQL Server - REVERSE()

  3. Hoe LOG2() werkt in MariaDB

  4. MySQL-zelfstudie:MySQL IN-instructie (geavanceerd)