http://www.jb51.net/article/50103.htm mysql 悲观锁 乐观锁mysql
http://blog.csdn.net/xifeijian/article/details/20313977 mysql 锁sql
建表优化
CREATE TABLE IF NOT EXISTS `article` (`id` INT(10) UNSIGNED NOT NULL 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,
PRIMARY KEY (`id`)
);.net
插数据htm
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');blog
建索引排序
ALTER TABLE `article` ADD INDEX X ( `category_id` , `comments`, `views` );
ALTER TABLE `article` ADD INDEX Y ( `category_id` , `views` ) ;索引
ALTER TABLE `article` ADD INDEX Z ( `comments` ) ;get
查表it
EXPLAIN
SELECT author_id
FROM `article`
WHERE comments > 1 AND category_id = 1
ORDER BY views DESC
LIMIT 1
结果
分析
按照 BTree 索引的工做原理,先排序 category_id,若是遇到相同的 category_id 则再排序 comments,若是遇到相同的 comments 则再排序 views。当 comments 字段在联合索引里处于中间位置时,因comments > 1 条件是一个范围值(所谓 range),MySQL 没法利用索引再对后面的 views 部分进行检索,即 range 类型查询字段后面的索引无效
优化:删除索引X DROP INDEX X ON article;
执行
EXPLAIN
SELECT author_id
FROM `article`
WHERE comments > 1 AND category_id = 1
ORDER BY views DESC
LIMIT 1
结果
执行
EXPLAIN
SELECT author_id
FROM `article`
WHERE comments > 1
ORDER BY views DESC
LIMIT 1
结果
结论 联合索引中包含 < > 操做时,索引中的部分会失效,把这部分从索引中去掉。
当存在多个索引时 包含 < 的索引会被忽略