Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengoptimalkan kueri MySQL untuk menghindari pemindaian banyak baris

Apa yang membuat Anda berpikir bahwa kueri akan memeriksa sejumlah besar baris?

Kueri akan memindai dengan tepat 30 catatan menggunakan UNIQUE indeks pada tag (tag, article_id) , gabungkan artikel ke setiap record di PRIMARY KEY dan berhenti.

Ini persis seperti yang dikatakan rencana Anda.

Saya baru saja membuat skrip pengujian ini:

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;

, di mana t_source adalah tabel dengan 1M record di dalamnya, dan jalankan kueri Anda:

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;

Itu instan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurai kode bawaan MySQL dari dalam Python?

  2. mendapatkan mysql_insert_id() saat menggunakan ON DUPLICATE KEY UPDATE dengan PHP

  3. Mysql memilih (n) baris dari setiap kejadian

  4. Jumlahkan hasil dari beberapa kueri lalu temukan 5 teratas di SQL

  5. MySQL, menyalin file tabel menimbulkan ERROR 1017 (HY000):Tidak dapat menemukan file:meskipun ada di sana