理想的索引:

  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. 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

    1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...

  2. Linux 系统启动过程,Linux 系统目录结构

    一.Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立 ...

  3. leetcode 849. Maximize Distance to Closest Person

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  4. OLT配置说明

    MA5680T>enable  进入特权模式   MA5680T#config  进入配置模式 MA5680T(config)#display current-configuration sim ...

  5. 【lightoj-1024】Eid (高精度)

    [题意] 给定n个数,求这n个数的最小公倍数. [题解] 最小公倍数当然不能按常规方法来求,因为最大的数将近是10000^1000级别的.然鹅最小公倍数怎么搞呢? 这里发现了一个规律: 4 5 6 3 ...

  6. zoj1654

    题解: 对于每一联通的x,y 检点 然后交叉的连边 然后二分图 代码: #include<cstdio> #include<cstring> #include<cmath ...

  7. json 解析double类型多出几位小数,利用NSDecimalNumber修复 , 服务器返回的数据,用数据类型接收(int,NSNumber)?

     后台返回float类型数据8.2,实际用AFN的json解析后得到8.1999999999,该怎么处理呢? 开发中处理处理价格金额问题, 后台经常返回float.double类型, 打印或转成NSS ...

  8. 《APUE》第7章 进程环境-读书笔记

    一.main函数. main函数的原型如下.argc是命令行参数的数目,argv是指向参数的各个指针所构成的数组. int main(int argc, char *argv[]) 当内核执行C程序时 ...

  9. shell脚本实例一

    一. 什么是shell 脚本时一种解释性语言: shell脚本保存执行动作: 脚本判定命令的执行条件 脚本来实现动作的批量执行.二.如何创建 vim  test.sh     ##shell脚本一般都 ...

  10. Confluence 安装

    一.事前准备 1.jdk安装:5.8.10的jdk至少是7,其中7中还有很多官网是不建议的,这儿选中jdk-7u79 二.安装Confluence 双击atlassian-confluence-5.8 ...