0.表结构如下:(包含两个索引)
1Create Table: CREATE TABLE `user` ( 2 `userID` varchar(40) NOT NULL, 3 `userCode` varchar(20) DEFAULT NULL, 4 `userName` varchar(25) DEFAULT NULL, 5 `password` varchar(20) DEFAULT NULL, 6 `userSort` varchar(30) DEFAULT NULL, 7 `userStuTeaNum` varchar(50) DEFAULT NULL, 8 `userUnitName` varchar(30) DEFAULT NULL, 9 `userUnitNum` varchar(30) DEFAULT NULL, 10 `isUse` varchar(2) DEFAULT NULL, 11 `remark1` varchar(20) DEFAULT NULL, 12 PRIMARY KEY (`userID`), 13 UNIQUE KEY `userCodeIndex` (`userCode`) 14) ENGINE=InnoDB DEFAULT CHARSET=utf8
前提是会使用explain分析SQL语句:
2.强制走索引
(1)直接查询使用的是userCodeIndex
1mysql> EXPLAIN SELECT userID FROM USER\G 2*************************** 1. row *************************** 3 id: 1 4 select_type: SIMPLE 5 table: USER 6 partitions: NULL 7 type: index 8possible_keys: NULL 9 key: userCodeIndex 10 key_len: 63 11 ref: NULL 12 rows: 3 13 filtered: 100.00 14 Extra: Using index 151 row in set, 1 warning (0.00 sec)
(2)强制使用主键索引
语法:
SELECT userID FROM USER FORCE INDEX(PRIMARY);
注意:INDEX(indexName)里面的参数是index的名称,而不是列名,如果不知道index名称可以通过下列方式查询:
1mysql> show index from tblname; 2 3mysql> show keys from tblname;
顺便说一句:key和index的区别:key有两个作用,一是约束字段,二是辅助查询(具备constraint和index的意义)
index只是辅助查询,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。
例如:强制使用userCodeIndex
1mysql> EXPLAIN SELECT userID FROM USER FORCE INDEX(PRIMARY)\G 2*************************** 1. row *************************** 3 id: 1 4 select_type: SIMPLE 5 table: USER 6 partitions: NULL 7 type: index 8possible_keys: NULL 9 key: PRIMARY 10 key_len: 122 11 ref: NULL 12 rows: 3 13 filtered: 100.00 14 Extra: Using index 151 row in set, 1 warning (0.00 sec)
3.强制不走缓存
SELECT SQL_NO_CACHE * FROM USER
在这里只是做记录,项目中还没有遇到这种需求。。。。。。。。。。。。。。。。。。。。。。。