mysql选择联合索引还是单索引?索引列应该使用哪一个最有效?深入測试探讨
先建表
CREATE TABLE `menu_employee` (
`Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键,无实际意义',
`employee_pid` int(5) DEFAULT NULL COMMENT '父节点序号,通常是部门的序号,可是已有例外,没有组的员工',
`employee_id` int(5) DEFAULT NULL COMMENT '员工序号,对应的部门序号+员工序号',
`employee_name` varchar(100) DEFAULT '' COMMENT '员工名称',
`action` varchar(100) DEFAULT NULL COMMENT 'action事件路径',
PRIMARY KEY (`Id`),
KEY`x` (`employee_id`,`employee_pid`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=38 DEFAULTCHARSET=utf8 COMMENT='员工表'
数据自己加入�.
好,開始測试:
写一个SQL,来跑一下试试
EXPLAIN
SELECT
employee_name
FROM
menu_employee
FORCE INDEX ( x )
WHERE
employee_id> 3
AND
employee_pid> 20
order by
employee_pid
建一个索引,依照黄金律,把WHERE跟着了,一起建一个联合索引.
结果是:
是不是非常奇怪,明明了用了索引了,但是却依旧是 Using filesort!
好,接着我们改回单索引
再看结果:
是不是非常奇妙?
再试一下,那我们假设把索引列换成employee_id会肿么样呢,我们来试一试,
竟然没有什么效果,还是Using filesort!
单索引比复合索引有效果!并且还要选对要索引的列!
接下来说复合索引
先建表:
CREATE TABLE `l_insertlogs` (
`ID` int(10) NOT NULL AUTO_INCREMENT,
`Counts` int(10) DEFAULT NULL,
`TablesName` char(30) DEFAULT NULL,
`OperateTime` datetime DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY`x` (`Counts`,`ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6155 DEFAULTCHARSET=utf8
跑一下:
EXPLAIN
SELECT
TablesName
FROM
l_insertlogs
FORCE INDEX ( x )
WHERE
IDbetween 100 and 500
AND
Counts> 14
order by
Counts
再来个索引,来一个复合双索引
结果一点也不好看
再试试,改成单的,用主键做列
还是不行
改成
这下即可了
所以说,双索引不一定有效,怎么使用要看实际情况,索引使用哪一列也是非常讲究的,这还是仅仅是表现,我还要接着深挖下去.
mysql选择联合索引还是单索引?索引列应该使用哪一个最有效?深入測试探讨的更多相关文章
- 使用复合索引代替单键索引,来避免单键有null值的情况
查看原表: SQL> select count(*) from t1; COUNT(*) ---------- 3229088 SQL> select count(*) from t1 w ...
- 《高性能MySQL》——第五章创建高性能索引
1.创建索引基本语法格 在MySQL中,在已经存在的表上,可以通过ALTER TABLE语句直接为表上的一个或几个字段创建索引.基本语法格式如下: ALTER TABLE 表名 ADD [UNIQUE ...
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...
- Mysql 创建联合索引注意事项
当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引. 如: 索引Index_1(Crea ...
- mysql索引 多个单列索引和联合索引的区别详解
背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引测 ...
- SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...
- mysql的联合索引的误解
https://www.zhihu.com/question/36996520 之前对于联合索引有一个误区, 假设 name,age为一个联合索引 5条索引记录 a 10 b 5 c 12 c 15 ...
- mysql索引之七:组合索引中选择合适的索引列顺序
组合索引(concatenated index):由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为 ...
- mysql 单表索引优化
建表语句 CREATE TABLE IF NOT EXISTS `article` ( `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMEN ...
随机推荐
- 【Linux安全】防止 root 用户远程登录
防止 root 用户远程登录,在终端输入以下命令: vim /etc/ssh/sshd_config 修改如下行为:no PermitRootLogin no 如图所示:
- ruby mysql数据库操作
require 'mysql' con=Mysql.new('localhost','root','root','test') con.query('set names utf8') rs=con.q ...
- 机器学习&深度学习经典资料汇总,data.gov.uk大量公开数据
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...
- hduAnother Graph Game
http://acm.hdu.edu.cn/showproblem.php?pid=4647 很扯的一题 将每条边的一半权值分给它所连的两个结点 #include <iostream> # ...
- hdu2852KiKi's K-Number(区间K值)
http://acm.hdu.edu.cn/showproblem.php?pid=2852 区间K值写错了... #include <iostream> #include<cstd ...
- BZOJ3230: 相似子串
3230: 相似子串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 913 Solved: 223[Submit][Status]Descripti ...
- XCode中Architecturs配置及常见问题
http://lanvige.github.io/2014/03/19/architecturs-in-xcode/ XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决 ...
- spring(6)--注解式控制器
6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated. 二.Spring2.5引入注解式处理器支持 ...
- codeforces 652E Pursuit For Artifacts 边双连通分量
题意:n个点,m条边的无向图,有的边上有标记,每条边只能走一次 给你一个起点,一个终点,询问是否能找到从起点到终点的路径,这条路径至少包含一条含有标记的边 分析:然后边双缩点 下面介绍一下边双的性质 ...
- oracle logminer全解析
今天写篇原创的,把在工作中遇到的logminer问题总结下 (1)简介: logminer 工具即可以用来分析在线,也可以用来分析离线日志文件,即可以分析本身自己数据库的重作日志文件,也可以用来分析其 ...