1.引入
我们在前面的课程中讲解了数据库表如何优化索引,那么这次课程开始,我们就更加较为升入的讲解索引优化的内容。那么我们先来看一下我们的查询操作什么时候会产生索引失效的问题。
2.创建数据库表以及索引
(1).创建数据库表book以及添加内容
-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bookname` varchar(255) DEFAULT NULL,
`price` decimal(50,0) DEFAULT NULL,
`author` varchar(255) DEFAULT NULL,
`typeid` int(25) DEFAULT NULL,
`picturePath` varchar(255) DEFAULT NULL,
`content` varchar(255) DEFAULT NULL,
`buytime` varchar(255) DEFAULT NULL,
`showposition` varchar(255) DEFAULT NULL,
`inventory` int(25) DEFAULT NULL,
`saleCount` int(25) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_bi` (`buytime`,`inventory`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('8', '巴黎圣母院', '450', '维克多雨果', '1', '栈.png', '这就是一个测试\r\n ', '2019-05-24', '1-1', '500', '201');
INSERT INTO `book` VALUES ('9', '测试', '12', '测试内容1', '1', 'rec.jpg', '这里是显示测试', '2019-05-20', '1-2', '520', '23');
INSERT INTO `book` VALUES ('10', '测试1', '13', '测试内容1', '3', 'rec.jpg', '看看决胜巅峰来表示', '2019-05-20', '1-2', '45', '12');
INSERT INTO `book` VALUES ('11', '测试2', '45', '测试内容2', '4', 'rec.jpg', '阿斯顿发世纪东方', '2019-05-20', '1-3', '78', '23');
INSERT INTO `book` VALUES ('12', '测试3', '78', '测试内容3', '5', 'rec.jpg', '发大家好轧空淡饭黄齑', '2019-05-21', '1-4', '457', '23');
INSERT INTO `book` VALUES ('14', 'mysql数据库', '99', '张三', '14', 'rec.jpg', 'mysql数据库作为一个关系型数据库', '2019-05-21', '1-c-2019', '300', '120');
INSERT INTO `book` VALUES ('16', 'C语言从入门到精通', '788', '测试', '1', 'rec.jpg', '你好,这就是测试内容', '2019-05-24', '1-1', '500', '100');
(2).查看数据库库表内容以及针对表字段创建索引
3.索引失效的情况
(1).全值匹配我最爱
如:我们在进行查询的时候使用常量值进行匹配,按照我们创建索引的顺序进行操作。
不按照索引的顺序进行匹配,不使用含有第一个索引price的字段情况查询
由上面的情况可见,全值匹配是指:我们操作或者查询的字段和我们创建的索引的字段顺序和内容一致。
(2).最佳左前缀法则
所谓的最佳左前缀原则,就是值当我们创建了复合索引的时候,查询从索引的最左前列开始并且不能够跳过索引列。我们在a,b,c列上创建索引idx_abc。那么能够使用索引的查询列操作是:a,ab,abc,ac,而b,bc是不能够使用该索引的(简记:带头大哥不能死,中间兄弟不能断)。如:
(3).不在索引列上做任何的操作(包括计算、函数、(自动或者是手动)类型转化),会导致索引失效而转向全表扫描。
简记:索引列上少计算
(4).存储引擎不能够使用索引中范围条件右边的列。(简记:范围之后全失效)
(5).尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *的操作。
(6).MySQL数据库在使用不等于(!=或者>,<)的时候无法使用索引会导致全表扫描。
(7).is null,is not null也无法使用索引。
(8).like以通配符开头(如:%abc...)mysql索引失效会变成全表扫描的操作。简记:百分like加右边。
但是,我们再实际的生成环境中,不同位置的"%"所带来的查询结果是不一样的。我们就需要有俩个“%”的情况,那么这一个时候。我们应该怎么解决这一个问题?
我们先看一下,如果没有建立索引,那么这一个时候它的查询情况是一个什么样子的?
我们创建索引,然后在进行数据的查询。
通过上面的查询,我们发现只有使用覆盖索引或者是索引部分字段的时候,我们才可以使用我们创建的索引
(9).字符串不能加单引号索引失效。
由于字符和其他数据类型在sql进行查询的时候存在着相互转化,那么这一个时候就是符合了(2)的内容,所以就会导致索引失效。
(10).少使用or,用它来连接的时候会索引失效。