建表
CREATE TABLE IF NOT EXISTS `article` (
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT(10) UNSIGNED NOT NULL,
`category_id` INT(10) UNSIGNED NOT NULL,
`views` INT(10) UNSIGNED NOT NULL,
`comments` INT(10) UNSIGNED NOT NULL,
`title` VARBINARY(255) NOT NULL,
`content` TEXT NOT NULL
);
INSERT INTO `article`(`author_id`, `category_id`, `views`, `comments`, `title`, `content`) VALUES
(1, 1, 1, 1, '1', '1'),
(2, 2, 2, 2, '2', '2'),
(1, 1, 3, 3, '3', '3');
SELECT * FROM article;
例題
- 查詢 category_id 為1 且 comments 大于 1 的情況下,views 最多的 article_id
一般
我們一般會使用以下語句查詢
EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
這個sql語句的type是all,并且Extra里面出現(xiàn)了Using filesort,這個必須優(yōu)化
添加索引
CREATE INDEX idx_article_ccv ON article(category_id,comments,views);
我們再次進(jìn)行上面語句的查詢
EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
我們可以看到type變成了range,但是extra里面卻是Using filesort ,這個性能有點差
優(yōu)化索引
BTree 索引的工作原理
- 他會先排序category_id
- 遇到相同的category_id 在排序comments
- 遇到相同的comments 在排序views
在上面語句中comments > 1 是一個范圍值(所謂range),range 類型查詢字段后面的索引無效,所以MySQL 無法利用索引再對后面的 views 部分進(jìn)行檢索文章來源:http://www.zghlxwxcb.cn/news/detail-430166.html
進(jìn)行優(yōu)化
- 我們刪除索引后進(jìn)行新建索引
DROP INDEX idx_article_ccv ON article;
- 新建索引
CREATE INDEX idx_article_cv ON article(category_id,views);
- 執(zhí)行slq語句
EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1;
我們發(fā)現(xiàn)type變成了ref,也沒有存在Using filesort了文章來源地址http://www.zghlxwxcb.cn/news/detail-430166.html
到了這里,關(guān)于查詢優(yōu)化之單表查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!