Mysql多列索引实践
在网上看到:
定义:最左前缀原则指的的是在sql where 子句中一些条件或表达式中出现的列的顺序要保持和多索引的一致或以多列索引顺序出现,只要 出现非顺序出现、断层都无法利用到多列索引。
该博文有误 ,暂未修改 2013年11月22日
打算实践一下,但是实践结果却正好相反,最后找出原因。
第一次实践过程如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* 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');
执行结果:居然走索引了,和网上结论不一致。
-----------------------------------------------------------------------------哥哥哥-----------------------------------------
第二次实践:正确,就是因为多了一个列(nimeiya),而在实际中,不太可能出现没有多余的列情况。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* 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');
因为年轻,所有没有失败。