mysql设置合适的索引长度
理想的索引:
相对于写操作来说,表查询很频繁的表建立索引
字段区分度高
长度小(合适的长度,不是越小越好)
尽量能够覆盖常用字段
这些条件综合起来才能够达到最优索引,本次我们着重聊一下建立合适长度的索引,索引的长度直接影响索引文件的大小,因此会影响增删改查的速度
给字符类型的字段设置长度字段查询时区分度要高,如果字段只是设置了一个那么回查询很多相似的匹配度不高,长度要恰到好处,否则太长索引文件就会大,因此
要在区分度和长度上做一个平衡。
1.先来看一下没设置索引的查询
mysql> explain select id,title from b2b_goods where title="测试商品";
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | b2b_goods | ALL | NULL | NULL | NULL | NULL | 5061 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
总结:发现该语句没有使用到索引,扫描了5061条数据
2.给title字段创建索引
mysql> alter table b2b_goods add index index_title(`title`);
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> explain select id,title from b2b_goods where title="测试商品";
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | b2b_goods | ref | index_title | index_title | 150 | const | 1 | Using where; Using index |
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
总结:发现该语句扫描条数降低了成了一条,说明是对的,但发现索引长度(key_len)过长这样当更新时是比较占内存的。
3.设置区分度高的并且长度适合的索引
习惯的算法:
select count(distinct left(`title`,num))/count(*) from b2b_goods;
这里num是指截取的长度,实际上也可以发现设置该长度的查询度,比例越大说明越良好
(1).设置6个长度
mysql> select count(distinct left(`title`,6))/count(*) from b2b_goods;
+------------------------------------------+
| count(distinct left(`title`,6))/count(*) |
+------------------------------------------+
| 0.7718 |
+------------------------------------------+
1 row in set (0.01 sec)
(2).设置13个长度
mysql> select count(distinct left(`title`,13))/count(*) from b2b_goods;
+-------------------------------------------+
| count(distinct left(`title`,13))/count(*) |
+-------------------------------------------+
| 0.8288 |
+-------------------------------------------+
1 row in set (0.01 sec)
(3).设置25个长度
mysql> select count(distinct left(`title`,25))/count(*) from b2b_goods;
+-------------------------------------------+
| count(distinct left(`title`,25))/count(*) |
+-------------------------------------------+
| 0.8562 |
+-------------------------------------------+
1 row in set (0.01 sec)
(4).设置30个长度
mysql> select count(distinct left(`title`,30))/count(*) from b2b_goods;
+-------------------------------------------+
| count(distinct left(`title`,30))/count(*) |
+-------------------------------------------+
| 0.8573 |
+-------------------------------------------+
1 row in set (0.01 sec)
(5).设置35个长度
mysql> select count(distinct left(`title`,35))/count(*) from b2b_goods;
+-------------------------------------------+
| count(distinct left(`title`,35))/count(*) |
+-------------------------------------------+
| 0.8573 |
+-------------------------------------------+
1 row in set (0.01 sec)
总结:发现设置字段的长度刚开始越来越大的时候匹配度高,到一定值变化就区域平缓,发现截取30个和35个没什么区分,综上所述并保持适当的长度
我们创建一个长度为25的索引
4.创建区分度高长度适中的索引
alter table b2b_goods drop index index_title;
alter table b2b_goods add index index_title(`title`(25));
mysql> explain select id,title from b2b_goods where title="测试商品";
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE | b2b_goods | ref | index_title | index_title | 75 | const | 1 | Using where |
+----+-------------+-----------+------+---------------+-------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
总结:跟之前没有设置长度的比较key_len由150减少为75,扫描条数依然是一条,相比之下这个长度是优秀的索引长度。
mysql设置合适的索引长度的更多相关文章
- MySQL 索引长度和区分度
首先 索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...
- Mysql索引长度和区分度
首先 索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...
- 【MySQL】索引长度的一些限制
有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 ...
- Lost connection to MySQL server during query,MySQL设置session,global变量及网络IO与索引
Navicat导出百万级数据时,报错:2013 - Lost connection to MySQL server during query 网上一番搜索,修改mysql如下几处配置文件即可: sel ...
- MySQL索引长度限制问题
在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes. MySQL版本为Server version: 5.1.36 ...
- MySQL索引的索引长度问题
转自:http://samyubw.blog.51cto.com/978243/223773 MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中 ...
- mysql索引长度
http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能 ...
- MySQL索引长度限制
索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...
- MySQL innodb的组合索引各个列中的长度不能超过767,
MySQL索引的索引长度问题 MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索 ...
随机推荐
- poj 3411 Paid Roads很水的DFS
题意:给你N 城市和M条道路,每条道路要付的钱,但是如果你在这个道路上你可以付其他道路的钱(跟走到的时候去的话不一样),问你从1走到N最少话费是多少. 直接DFS搜. 链接http://poj.org ...
- 变更Linux下的Java版本 alternatives
默认正常情况下,即使使用Java 1.6版本Java脚本jdk-6u31-linux-i586.bin,安装Java运行后,会出现自动升级为1.7版本状态的情况.针对某些应用程序需要基于1.6版本方可 ...
- linux FTP 操作
1.登陆: ftp 172.xxx.xxx.xxx 按提示输入用户名和密码 2.上传: 单个文件:put /路径/文件名 批量: 输入 prom 此命令是关闭交互(否则总是询问你是否要上传) 输入下载 ...
- 什么是Quartz?
什么是Quartz Quartz是一个开源的作业调度框架,Quartz根据用户设定的时间规则来执行作业,使用场景:在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知. ...
- 启动和停止Oracle服务bat脚本
总所周知,Oracle随开机启动会占很大内存,而你每次想用的时候还得去计算机服务里去找服务.一个一个的启动,比较麻烦. 这里给出两个bat脚本,来直接双击启动和停止Oracle服务[脚本内容来源于网络 ...
- SpringXML方式配置bean的集合注入:list,map,properties
新建一个bean,设置相应的集合属性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Collecti ...
- 【转】react-native开发混合App-github开源项目
http://www.lcode.org/study-react-native-opensource-one/ http://gold.xitu.io/entry/575f498c128fe10057 ...
- 现代前端技术解析:Web前端技术基础
最近几年,越来越多的人投入到前端大军中:时至至今,前端工程师的数量仍然不能满足企业的发展需求:与此同时,互联网应用场景的复杂化提高了对前端工程师能力的要求,一部分初期前端工程师并不能胜任企业的工作 ...
- ARM寄存器总结:
ARM有16个32位的寄存器(r0到r15). r15充当程序寄存器PC,r14(link register)存储子程序的返回地址,r13存储的是堆栈地址. ARM有一个当前程序状态寄存器:CPSR. ...
- 6LowPan 开发之开山篇
本文参考: http://blog.csdn.net/xukai871105/article/details/9204101 1.基本概念 1) instant contikit Ubu ...