MySQL_MySQL单表索引优化实例

1.引入

   由上节课,我们把MySQL性能分析的内容较为详细的讲了一下,那么这一节课,我们就使用实际的查询例子进行MySQL数据库的查询索的性能调优。

2.索引单表优化

创建数据库表内容,并添加数据记录

-- ----------------------------
-- 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`)
) 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');

(1).进行查询操作

     查询:buytime为2019-05-24且价格price大于100,库存量(inventory)最多的记录。

     在没有进行任何优化操作的情况下,我们只考虑功能的实现,我们进行查询操作explain效果如下:

     

     我们呢按照我们我们能够实现的代码操作,完成了这一个功能。但是呢,我们在进行explain操作的时候发现我们的type是属于ALL,也就是说是全表的扫描。然后我们的Extra中还出现了Using filesort。这样的情况我们就需要进行优化。

     ①:查看是否建立了索引内容

      

      ②:创建索引,由于我们的查询条件是按照三个内容进行查询的操作,那么我们就对这三个字段创建符合索引

     ③:我们在创建好索引以后,在进行查询操作

    ④:在我们创建好索引以后,我们再次进行查询的时候发现我们查询操作的type已经由ALL转变到了range。但是呢我们在这里还需要解决一个问题就是我们的Extra中还存在着文件内排序:Using filesort.存在文件内排序的情况主要是由于存在着范围的查找,所以我们应该从这一个节点入手解决这一个问题。那么为什么我们创建了的索引回无效呢?按照MySQL索引的Btree原理,我们对三个字段内容进行了索引的创建。那么MySQL数据库就会按照我们创建索引的顺序对三个字段进行排序。但是在遇到price的时候。我们查询的是一个范围条件,那么这一个时候。MySQL就无法再对后面的字段inventory进行排序,所以我们查询的sql的type是range。

    ⑤:由于我们创建的索引idx_bpi无法解决price > 100导致的文件内排序,所以我们把创建的索引删除。

     ⑥:我们看一下在price这一个字段上建立索引会产生文件内排序,那么,我们在创建索引的时候能不能绕开price字段呢?

    ⑦:我们再次查询,看效果是否会改变

     在我们修改了索引以后,我们发现我们使用explain分析sql的几个重要的内容基本已经优化到位。

发布了51 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u013185175/article/details/104282319