一、索引的优点

1、索引可以大大减少服务器需要扫描的数据量

2、索引可以帮助服务器避免排序和临时表。

3、索引可以将随即I/O变为顺序I/O

二、索引策略

1、独立的列

独立的列是指索引列不能是表达式的一部分,也不能是函数参数。例如:

一个有500W条记录的表,id是主键。

所以要始终将索引列单独放在比较符号的一侧。

2、前缀索引和索引选择性

对于比较大的列,通常可以索引开始的部分字符,这样可以节约索引空间,提高索引率。但是也会降低索引的选择性。

索引的选择性是指,不重复的索引值(基数)和表的记录总数的比值,索引的选择性越高查询效率就越高,因为可以在查找时过滤掉更多的行,唯一索引的选择性是1,性能是最好的。

如何来选择一个合适的长度,让前缀的基数接近完整列的基数,一般我们有2中方法:

a、为了决定前缀的合适长度,需要找到最常见的值的列表,然后和最常见的前缀列表进行比较。

举例:有一张100W记录的表,要对name添加前缀索引

首先找到最常见的name列表

select count(*) as cnt,name from vemp group by name order by cnt desc limit 10;

每个值出现的次数在12-15之间,现在开始测试前缀从3个前缀开始

可以看到每个前缀出现的次数明显增多了,也就是唯一前缀重复的太多,这需要增加前缀个数直到前缀出现的次数基本接近即可,因为本表此列长度很短并且比较固定,所以并不是很理想的测试数据,可以看到当长度为5的时候就接近一些了。

b、另外一个办法就是计算整列的选择性,并使前缀的选择性接近完整列的选择性。

先计算整列的选择性

计算不同的前缀对应的选择性值

这里差距有点大,主要因为测试数据太短,没必要使用前缀,这里只是介绍一个方法,选取一个合适的长度,要足够接近就好了。

找到合适的长度就可以创建索引了

alter table vemp add key(name(5));

前缀索引可以更小,更快,但是也有缺点:

1、无法使用前缀索引做order by和group by,也无法使用前缀做覆盖扫描。

注意:可以把字符串反转后存储,建立前缀索引,其实就相当于建立后缀索引了,例如找到某个域名的所有电子邮件地址。

3、多列索引(复合索引)

不要盲目的在很多个单列上创建单列的索引。

MySQL5.0以后的版本,引入了“索引合并”,在一定程度上可以使用表上的多个单列索引来定位指定的行,这种算法有3个变种:OR条件的联合(union)、AND条件的相交(intersection)、组合前两种情况的联合及相交。如果你在Extra看到下面的语句就说明用到了索引合并:

索引合并有时候是一种优化的结果,但实际上说明表的索引建立的很糟糕。

4、选择合适的索引序列

一个经验法则:当不考虑排序和分组时,将选择性最高的列放在前面通常是好的。

例如下列查询

select * from emp2 where num2=2000 and job_num=373;

是应该创建一个(num2,job_num)索引还是应该颠倒一下呢?可以看看哪个列的选择性更好或者看看where条件哪个分支对应的基数数据有多大:

所以应该把job_num放到前面,因为对应条件数量更小。

这只是个别数据,可能对其他一些数值查询不公平,如果考虑全局,可以计算一下选择性,这个方法前面已经提到了,把选择性高的列放到前面。

高性能的MySQL(5)索引策略相关推荐

  1. MySQL之高性能的索引策略(索引优化)

    高性能的索引策略 高效地选择和使用索引有很多种方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化. 独立的列 如果查询中的列不是独立的,则MySQL就不会使用索引."独立的列 ...

  2. 《高性能MySQL》阅读-高性能索引策略

    [四非凡人]:才德兼备是圣人,无才有德是贤人, 有才无德是小人,才德俱失是庸人. 高性能的索引策略 独立的列 ① 是指索引列不能是表达式的一部分,也不能是函数的参数(MySQL8.0版本之后可以有函数 ...

  3. mysql 索引案例与索引策略

    目录 索引案例学习 支持多种过滤条件 避免多个范围条件 优化排序 分页查询优化 分而治之总是不错的 索引高性能策略 策略总结 独立的列 前缀索引和索引选择性 多列索引 选择合适的索引列顺序 聚簇索引 ...

  4. 【Mysql性能调优】高性能表结构及索引设计的最优实践

    数据库表设计 良好的表结构设计是高性能的基石,应该根据系统将要执行的业务查询来设计,这往往需要权衡各种因素.糟糕的表结构设计,会浪费大量的开发时间,严重延误项目开发周期,让人痛苦万分,而且直接影响到数 ...

  5. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  6. mysql构架,索引,视图,查询语句

    mysql构架: connection pool:因为单进程多线程,所以需要一个线程池接收请求提供并发,线程重用,还能完成认证 SQL interface:接收并分析SQL语句 Parser:分析器, ...

  7. MySql数据库索引原理

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...

  8. Mysql数据库索引原理及算法原理

    前言 面试的时候总会被提及一些关于数据库操作的问题,那么数据库索引作为一项热门问题,总会被问到.最近在网上看到了一篇关于mysql数据库索引的好文章,认真看完之后肯定受益匪浅,(虽说有的地方我不太理解 ...

  9. 【MySQL】索引的使用和优化

    转载自:mysql索引的使用和优化 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查 ...

最新文章

  1. Python监控目录文件夹,并使用SFTP上传目录及文件到linux服务器
  2. 如何让黑白图片恢复“生机”
  3. mysql中的cache和buffer_mysql Cache和Buffer区别有哪些?
  4. 猜数字游戏,正确率为零
  5. adb 由于目标计算机积极拒绝,无法连接
  6. 在灾难发生之时,你在Facebook的社交定位或许能救你一命
  7. 软件构造 第一章第二节 软件开发的质量属性
  8. 论文排版怕翻车?这个排版神器赶紧用起来!
  9. jboss ejb_使用JBoss AS 7进行SSL加密的EJB调用
  10. Linux 命令之 ll -- 列出当前文件或目录的详细信息
  11. 一篇文章学习Python中的多线程
  12. 国内外最顶级的8大plm项目管理系统
  13. layui 表单模板
  14. STM32与jink连接烧录程序
  15. 巴西区域赛补题C. Creating Multiples —— 数学*
  16. red and black trees(红黑二叉树)
  17. jQuery.Deferred() 方法
  18. 超导磁通量子计算机,超导量子比特系统在量子信息中的应用
  19. 2021年中国货物运输量、货物运输周转量及港口货物情况分析[图]
  20. 小米兰亭pro ttf_探索 让未来多一种可能 小米5G新品发布会直播

热门文章

  1. AI给老照片上色,真的准吗?技术圈和历史圈吵了1000帖
  2. 波士顿动力机器狗新技能!跳绳园艺做家务,还有书法神技
  3. IEEE Fellow、AI大牛田奇加入华为云!他为何而来?“加速AI基础研究落地”
  4. Apollo 11登月代码成Github热度第一:14.5万行,获星3.3万
  5. 细思极恐!只需54块钱,你也能让AI伪造一系列联合国发言
  6. scala入门--快学scala第一章练习题
  7. 健身励志——肌肉不经锤炼不会增长
  8. MySQL5.6 新特性(全局事务标示符(GTID))
  9. PostgreSQL在何处处理 sql查询之五十二
  10. windows2003时间同步更新脚本