理想的索引:

  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. linux-Centos7安装php

    先安装相关依赖包 yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel gd gd-devel libjpeg libjp ...

  2. wordpress启动

    wordpress启动 公司需要使用到wordpress 特意下载源码进行研究,才发现里面都是.php文件,需要运行php而不得不去配置运行环境 步骤如下 Wampserver32 使用的360安装的 ...

  3. 013——数组(十三) array_push array_rand array_reverse

    <?php /* 数组 array_push array_rand array_reverse */ //array_push()在数组的末端,增加一个或多个元素,入栈 /*$array = a ...

  4. C#学习历程(三)[基础概念]

    >>简单描述OOP 面向对象编程是由面向过程编程发展而来,不再注重于具体的步骤,而是更多的聚焦于对象. 以对象为载体,然后去完善对象的特点(属性),然后实现对象的具体的功能,同时处理对象与 ...

  5. C# 如何判断字符串中是否包含另一个字符串?

    如  字符串1(str1)为:“你好怎么解决呢!”    字符串2(str2)为:“你好” 如果str1里面包str2 则 Response.Write("成功");否则 Resp ...

  6. MySQL 大表在线DML神器--pt-online-schema-change

    一个朋友问我在线对大表进行ddl操作,如何做能尽量避免主从延迟以及不影响在线dml操作呢?我想到一个开源的pt-online-schema-change工具,测试了吧,效果还可以. pt-online ...

  7. java.lang.IllegalArgumentException: Invalid character found in method name

    1.错误描述 信息: Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors ...

  8. oracle数据库导入导出09192255

    1.导入数据库(dmp) Linux系统中: 1. 用root账号登录服务器,然后切换到oracle账号(安装oracle数据库的时候用的用的账号) 2. 切换到oralce的安装目录下的bin下 3 ...

  9. Synchronized之一:基本使用

    目录: <Java并发编程之三:volatile关键字解析 转载> <Synchronized之一:基本使用> Synchronized作用 1.Synchronized可以保 ...

  10. BDD测试框架Spock概要

    前言 为了找到一个适合自己的.更具操作性的.以DDD为核心的开发方法,我最近一直在摸索如何揉合BDD与DDD.围绕这个目标,我找到了Impact Mapping → Cucumber → Spock ...