zyllf2009 发表于 2018-10-9 08:14:39

MySQL索引优化实例说明

  下面分别创建三张表,并分别插入1W条简单的数据用来测试,详情如下:
   test_a 有主键但无索引
  CREATE TABLE `test_a` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `number` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
   test_b 有主键和单列索引
  CREATE TABLE `test_b` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `number` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `titleIndex` (`title`) USING BTREE,
  UNIQUE KEY `numberIndex` (`number`) USING BTREE
  ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
   test_c 有主键和组合索引
  CREATE TABLE `test_c` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text NOT NULL,
  `number` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `titleNumberIndex` (`title`,`number`) USING BTREE
  ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
  下面按照单列索引和组合索引分别对以上三张表进行查询测试,另外下面的时间都是多次测试取的平均值。
   单列索引
   查询指定的字段

   SELECT * FROM test_a WHERE>   12ms

   SELECT * FROM test_b WHERE>      13ms

   SELECT * FROM test_b WHERE>   13ms
  说明:两者用时基本一致,因此索引并未命中。

   SELECT * FROM test_a WHERE>   12ms

   SELECT * FROM test_b WHERE>      13ms

   SELECT * FROM test_b WHERE>   13ms
  说明:两者用时基本一致,因此索引并未命中。

   SELECT * FROM test_a WHERE>   13ms

   SELECT * FROM test_b WHERE>      12ms

   SELECT * FROM test_b WHERE>   ,>=,= 5000;
   14ms
   SELECT * FROM test_b FORCE INDEX(numberIndex) WHERE number >= 5000;
   14ms
   SELECT * FROM test_a WHERE number BETWEEN 4999 AND 5001;
   11ms
   SELECT * FROM test_b WHERE number BETWEEN 4999 AND 5001;
      13ms

   SELECT * FROM test_c WHERE>   13ms
  说明:组合索引中的OR语句没有命中索引。
   测试AND语句

   SELECT * FROM test_a WHERE>   12ms

   SELECT * FROM test_c WHERE>      12ms

   SELECT * FROM test_c WHERE>   或
页: [1]
查看完整版本: MySQL索引优化实例说明