Mysql多列索引实践

在网上看到:

定义:最左前缀原则指的的是在sql where 子句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要 出现非顺序出现、断层都无法利用到多列索引。

该博文有误 ,暂未修改 2013年11月22日

 

打算实践一下,但是实践结果却正好相反,最后找出原因。

 

第一次实践过程如下: 

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50515
Source Host           : localhost:3306
Source Database       : wangchy

Target Server Type    : MYSQL
Target Server Version : 50515
File Encoding         : 65001

Date: 2013-08-23 10:51:14
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for test_bak
-- ----------------------------
DROP TABLE IF EXISTS `test_bak`;
CREATE TABLE `test_bak` (
  `name` char(255) NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` char(11) DEFAULT NULL,
  `score` char(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`,`age`,`score`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_bak
-- ----------------------------
INSERT INTO `test_bak` VALUES ('lisan', '3', '33', '44');
INSERT INTO `test_bak` VALUES ('test', '2', '22', '33');
INSERT INTO `test_bak` VALUES ('wangchy', '1', '11', '23');
View Code

执行结果:居然走索引了,和网上结论不一致。

 

-----------------------------------------------------------------------------哥哥哥-----------------------------------------

 

第二次实践:正确,就是因为多了一个列(nimeiya),而在实际中,不太可能出现没有多余的列情况。

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50515
Source Host           : localhost:3306
Source Database       : wangchy

Target Server Type    : MYSQL
Target Server Version : 50515
File Encoding         : 65001

Date: 2013-08-23 10:51:09
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(255) NOT NULL,
  `age` char(11) DEFAULT NULL,
  `score` char(11) DEFAULT NULL,
  `nimeiya` varchar(20) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `name` (`name`,`age`,`score`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'wangchy', '11', '23', '0');
INSERT INTO `test` VALUES ('2', 'test', '22', '33', '0');
INSERT INTO `test` VALUES ('3', 'lisan', '33', '44', '0');
View Code

 

posted @ 2013-08-23 11:01  爱我所艾  阅读(377)  评论(0编辑  收藏  举报