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 shell sleep/wait(转载)
linux shell sleep/wait(转载) 2007-04-27 18:12 bash的基本配置是由配置文件组成的./etc/profile称之为shell的全局配置文件.另外一个文件在个人 ...
- JNI编程(一) —— 编写一个最简单的JNI程序
来自:http://chnic.iteye.com/blog/198745 忙了好一段时间,总算得了几天的空闲.貌似很久没更新blog了,实在罪过.其实之前一直想把JNI的相关东西整理一下的,就从今天 ...
- 【DataStructure In Python】Python实现各种排序算法
使用Python实现直接插入排序.希尔排序.简单选择排序.冒泡排序.快速排序.归并排序.基数排序. #! /usr/bin/env python # DataStructure Sort # Inse ...
- bzoj2506
不知道该给这题贴什么标签了,但是这是一道好题1.注意这道题的询问是满足区间减法的,我们可以把一个询问拆成两个询问离线搞搞,这个思想在后面会见到2.分类的思想,这道题的求相同余数看似很烦,实际上我们发现 ...
- bzoj2281
有思维难度的好题这种题我们一般可以先从部分分考虑30%的分数k=2也就是黑白各一个不难发现如果初始黑白棋子相邻那必然是先手必败态否则一定是先手必胜那么30分的部分分是很容易拿到的,组合数学如果有多个棋 ...
- javascript点击图片放大的功能(原生)
使用的图片: 1.jpg <!doctype html> <html lang="en"> <head> <meta charset=&q ...
- haporoxy的keeplaive ZZ
转载一个别人总结的http://hi.baidu.com/%D3%E3%B5%C1%B5%C1/blog/item/04ffd1b1854f69ef30add1e8.html httpclose, h ...
- HDU 2191
思路:简单动态规划,多重背包转化成0 1背包问题 #include<stdio.h> #include<string.h> int a[101][2001],rcw[2001] ...
- python获取当前路径几种方式
__python中操作路径,最好用绝对路径.__这样会避免在多个脚本调用过程中或不同层级调用过程中出现混乱 os.getcwd() sys.argv[0] or sys.path[0] __file_ ...
- selenium WebDriver 获取disabled文本框内容(转)
有这样一个元素:<input name="name" id="id" type="text" disabled="true& ...