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,注意这里索 ...
随机推荐
- MYSQL中的日期转换
MYSQL中的日期转换 网址: http://www.eygle.com/digest/2006/09/mysql_date_convert.html 对于每个类型拥有的值范围以及并且指定日期何时间值 ...
- Chrome浏览器最小字体12px限制问题解决方法
问题描述: 页面宽度有限的情况下显示大数据,采用font-size:8px来压缩字体大小,版本 25.0.1547.66及以下版本的chrome浏览器没有问题,后续版本的就不可以了: 问题原因: 浏览 ...
- Django-自定义分页组件
1.封装的分页代码: class PageInfo(object): def __init__(self,current_page,all_count,per_page,base_url,show_p ...
- UNIX发展史(BSD,GNU,linux)(转)
转自 UNIX发展史(BSD,GNU,linux) 这篇文章写的非常好,在这里转一下. 先前的一個理想 UNIX 系统自 1969 年 Ken ThompsonKen Thompson 与 Denni ...
- 使用fill_n算法
今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...
- iOS 网络编程(HTTP协议)
HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...
- JavaScript动态加载js文件
/********************************************************************* * JavaScript动态加载js文件 * 说明: * ...
- phpcms tag页调用缩略图
\phpcms\modules\content\tag.php 找到: 'title, description, url, inputtime, style' 改成:'title, thumb, de ...
- quick2.2.6 问题记录
1.luasocket 不能使用方式 用下面地址的文件替换文件重新编译 https://github.com/chukong/quick-cocos2d-x/blob/master/lib/cocos ...
- does not contain bitcode ShardSDK等三方库
今天升级了XCode到7.0 重新编译项目出现了下面这些错误提示, ShardSDK/ShareSDK.framework/ShareSDK' does not contain bitcode. ...