理想的索引:

  1. 相对于写操作来说,表查询很频繁的表建立索引

  2. 字段区分度高

  3. 长度小(合适的长度,不是越小越好)

  4. 尽量能够覆盖常用字段

这些条件综合起来才能够达到最优索引,本次我们着重聊一下建立合适长度的索引,索引的长度直接影响索引文件的大小,因此会影响增删改查的速度

给字符类型的字段设置长度字段查询时区分度要高,如果字段只是设置了一个那么回查询很多相似的匹配度不高,长度要恰到好处,否则太长索引文件就会大,因此

要在区分度和长度上做一个平衡。

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设置合适的索引长度的更多相关文章

  1. MySQL 索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  2. Mysql索引长度和区分度

    首先  索引长度和区分度是相互矛盾的, 索引长度太短,那么区分度就很低,吧索引长度加长,区分度就高,但是索引也是要占内存的,所以我们需要找到一个平衡点: 那么这个平衡点怎么来定? 比如用户表有个字段 ...

  3. 【MySQL】索引长度的一些限制

    有同学问到InnoDB的索引长度问题,简单说几个tips. MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. myisam表,单列索引,最大长度不能超过 1000 ...

  4. Lost connection to MySQL server during query,MySQL设置session,global变量及网络IO与索引

    Navicat导出百万级数据时,报错:2013 - Lost connection to MySQL server during query 网上一番搜索,修改mysql如下几处配置文件即可: sel ...

  5. MySQL索引长度限制问题

    在修改表结构时出现了错误:Specified key was too long;max key length is 1000 bytes. MySQL版本为Server version: 5.1.36 ...

  6. MySQL索引的索引长度问题

    转自:http://samyubw.blog.51cto.com/978243/223773 MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中 ...

  7. mysql索引长度

    http://blog.csdn.net/qsc0624/article/details/51335632 大家应该知道InnoDB单列索引长度不能超过767bytes,联合索引还有一个限制是长度不能 ...

  8. MySQL索引长度限制

    索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 innodb引擎的每个索引列长度限制为767字节(bytes),所有组成索引列的长度和不能大于3072字节 myisam引擎 ...

  9. MySQL innodb的组合索引各个列中的长度不能超过767,

    MySQL索引的索引长度问题   MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索 ...

随机推荐

  1. Friendly Date Ranges

    让日期区间更友好! 把常见的日期格式如:YYYY-MM-DD 转换成一种更易读的格式. 易读格式应该是用月份名称代替月份数字,用序数词代替数字来表示天 (1st 代替 1). 记住不要显示那些可以被推 ...

  2. laravel中composer镜像服务的方式

    系统全局配置:即将配置信息添加到Composer的全局配置文件config.json中. 单个项目配置:将配置信息添加到某个项目的composer.json文件中. 例1:修改Composer的全局配 ...

  3. 【51nod-1396】还是01串

    给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n, 并且子串s[0..k - 1]中的0的个数与子串s[k..n - 1]中1的个数相等. 注意: (1) 如果 ...

  4. SQL SERVER 算法执行效率

    较差的性能 <---没有索引(为每个表执行表扫描) --->非聚集非覆盖索引(seek+局部有序扫描+lookups) ---> 聚集索引(seek+局部扫描) ---> 非聚 ...

  5. 【css】CSS3 Media Queries 详解【转】

    说起CSS3的新特性,就不得不提到 Media Queries .最近 Max Design 更新的一个泛读列表里,赫然就有关于 Media Queries 的文章.同时位列其中的也有前天我刚刚翻译的 ...

  6. iOS二维码、条形码生成(可指定大小、颜色)

    一.前言: iOS7.0之后可以利用系统原生 API 生成二维码, iOS8.0之后可以生成条形码, 系统默认生成的颜色是黑色. 在这里, 利用以下方法可以生成指定大小.指定颜色的二维码和条形码, 还 ...

  7. SortedList【排序列表】

    C# 集合 SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问. 排序列表是数组和哈希表的组合.它包含一个可使用键或索引访问各项的列表.如果您使用索引访问各项 ...

  8. vue自定义指令v-scroll(directive)

    vue开发中,很多地方如果说都用到了某一方法,我们就可以进行指令化封装,通过自定义指令来实现这里通过两个例子说明vue-Directive的使用 1.v-focus 主要用来实现页面加载进来的时候文本 ...

  9. 【剑指offer】数组中的逆序对。C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...

  10. MySQL 5.7笔记

    1. 初始化 重命名my-default.ini为my.ini 添加character_set_server=utf8 运行mysqld --initialize 2. 重置密码 服务器运行: mys ...