一、概述
MySQL的表設計中,常常會遇到添加索引列。索引的好處就是加快查詢,但是也會代來一定額外資源的開銷。如何規範設計索引,將幫助我們事半功倍。
二、索引設計規範
- 不要再頻繁更新的字段使用索引
- 區分度不高的列
- 組合索引把區分度較高的列放在前面
三、使用索引注意的點
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) NOT NULL COMMENT '商品名稱',
`price` decimal(10,0) NOT NULL COMMENT '商品價格',
`in_time` datetime NOT NULL COMMENT '入庫時間',
`out_time` datetime NOT NULL COMMENT '出庫時間',
PRIMARY KEY (`id`),
KEY `idx_price` (`price`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- 查詢列使用 !=、>、<等導致全表掃描。
- where屬性使用函數和表達式會導致全表掃描。
- 聯合索引,要滿足最左匹配原則
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) NOT NULL COMMENT '商品名稱',
`price` decimal(10,0) NOT NULL COMMENT '商品價格',
`in_time` datetime NOT NULL COMMENT '入庫時間',
`out_time` datetime NOT NULL COMMENT '出庫時間',
PRIMARY KEY (`id`),
KEY `idx_pri_in_end` (`price`,`in_time`,`out_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
- 假設聯合索引順序(a,b,c),where a = … and c = …,是否使用索引:使用
- 假設聯合索引順序(a,b,c),where a = … and b = …,是否使用索引:使用
- 假設聯合索引順序(a,b,c),where a > … and b = …,是否使用索引:否,當第一個索引沒用到,後面索引也會失效。
四、慢SQL查詢優化辦法
- 不要使用select *from 的格式 :因爲不需要的字段查詢(有可能是個很大字段)查詢會增加開銷
- 增加索引
- explain查詢執行計劃:是否使用到索引