Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tối ưu hóa truy vấn MySQL để tránh quét nhiều hàng

Điều gì khiến bạn nghĩ rằng truy vấn sẽ kiểm tra một số lượng lớn các hàng?

Truy vấn sẽ quét chính xác 30 bản ghi sử dụng UNIQUE lập chỉ mục trên thẻ tag (tag, article_id) , tham gia bài viết với từng bản ghi trên PRIMARY KEY và dừng lại.

Đây chính xác là những gì kế hoạch của bạn nói.

Tôi vừa tạo tập lệnh thử nghiệm này:

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;

, trong đó t_source là một bảng có 1M ghi lại trong đó và chạy truy vấn của bạn:

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;

Nó diễn ra ngay lập tức.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kỹ thuật tốt nhất để lưu vào bộ nhớ đệm kết quả từ các truy vấn không thường xuyên thay đổi

  2. Tại sao InnoDB cung cấp thông tin không gian trống rõ ràng là sai

  3. Python chuyển đổi kết quả truy vấn mysql thành json

  4. Cách lấy địa chỉ IP [MYSQL]

  5. Chèn, Cập nhật, Xóa các hàng của jtable có dữ liệu mysql