Mysql
 sql >> база данни >  >> RDS >> Mysql

Оптимизиране на MySQL заявка за избягване на сканиране на много редове

Какво ви кара да мислите, че заявката ще проучи голям брой редове?

Заявката ще сканира точно 30 записва с помощта на UNIQUE индекс на tag (tag, article_id) , присъединете статията към всеки запис на PRIMARY KEY и спрете.

Точно това казва вашият план.

Току-що направих този тестов скрипт:

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;

, където t_source е таблица с 1M записи в него и изпълнете заявката си:

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;

Беше мигновено.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да архивирам цялата база данни на MySQL с всички потребители и разрешения и пароли?

  2. Кой метод е по-добър за валидиране на потребителските идентификационни данни?

  3. създайте 3 зависими падащ списък с помощта на php ajax mysql

  4. Как да извлека всеки N-ти запис от таблица?

  5. Защо размерът на таблицата на InnoDB е много по-голям от очакваното?