索引长度

索引长度短,区分度就低,索引长度长,区分度高,查询效率高,但是索引要占内存,所以要找到一个平衡点;

举个例子: (张,张三,张三哥),如果索引长度取1的话,那么每一行的索引都是 张 这个字,完全没有区分度,结果这样三行完全是随机排的,因为索引都一样;如果长度取2,那么排序的时候至少前两个是排对了的,如果取3,区分度达到100%,已经提前排序;

有一些特殊的字段比如url,绝大部分的url都是 http://www. 开头的,这种情况下索引长度取取到11都是无效的,需要更长的索引,那么有没有优雅的方式来解决呢;
第一种方法: 可以将数据倒序存入数据库;
第二种方法:对字符串进行crc32哈希处理;

建立索引

在多个Where条件的时候,会优先采用rows最少的索引。如果多个Where条件查询很频繁,则将where中所有字段加到联合索引。
注意:

  • 数据区分度低的不应建立索引,比如sex就0、1,即区分50%。一般若rows大于总数据条数20%,则数据库走全表扫描。
  • 如果该表大部分是单条查询,则应使用hash索引,因为B-Tree索引时间复杂度O(log(n)),Hash索引为O(1)。
  • where子句的查询条件里有 != ,索引将无效。可以优化为in(xx, xx)
  • where子句使用了sql函数的时候,索引将无效,比如:select * from tb where YEAR(data) < '2017'; 可优化为 data < CURDATE()
  • LIKE查询必须是前缀固定的,否则无法使用索引。如:Title%可以使用索引,%Title和%Title%不能使用索引。
  • 索引列尽量避免NULL,应该指定列为NOT
    NULL或设置默认值。在MySQL中,含有NULL值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。索引不存Null值,所以会导致 SELECT * FROM tb WHERE name != 'xxx' 不会返回name为Null的数据。
  • 对于复合索引(key1, key2),select * from tb where key1 = xxx and key2 = xxxselect * from tb where key1 = xxx 会走复合索引,而 select * from tb where key2 = xxx 不会走复合索引。即最左前缀匹配。
  • 当你需要在一篇大的文章中搜索一个词时,如: “WHERE content LIKE
    ‘%apple%’”,索引是没有意义的,这需要全文索引。InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,可对CHAR、VARCHAR、TEXT类型的列创建全文索引,全文搜索的语法:MATCH(col1,col2,…) AGAINST (expr[search_modifier]),默认情况下全文搜索大小写不敏感。
  • 不要触发强制类型扫描,比如 select * from tb where phone = 18812345678,其中phone为varchar,这不会走索引。
  • 在col_1和col_2上建立索引,不要select * from tb col_1=2 or col_2=2,应优化为select * from tb where col_1=2 union select * from tb where col_2=2

索引覆盖(复合索引)

对于select key_1  from t where key_2 ·····;这样的查询,查询的处理过程为:首先去检索key_2索引找到主键id,然后根据主键id去检索正确的数据行。这样就是两次检索。
将key_1和key_2加到联合索引,InnoDB可以直接在索引中获取结果数据集,这就是索引覆盖。

以下情况,InnoDB无法覆盖查询:
1 select选择的字段中含有不在索引中的字段 ,也即索引没有覆盖全部的列。
2 where 条件中不能含有对索引进行like的操作。

Join的列索引化

如果应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。Join的字段,应该是相同的类型的,对于STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)

MySql - 索引相关推荐

  1. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  2. mysql索引教程_MySQL教程96-MySQL索引类型

    索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同.MySQL 索引可以从存储方式.逻辑角度和实际使用的角度来进行分类. 存储方式区分 根据存储方式的不同,MySQL 中常用的索引在 ...

  3. mysql 树形结构_再读MySQL索引-《高性能MySQL》索引手记

    最近工作中经常和MySQL打交道,当数据量小的时候,不同查询方式以及是否使用索引并无大碍,当数据量随着业务的成长急剧加速时,索引的重要性不言而喻. 本篇文章以<高性能MySQL>中的索引章 ...

  4. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  5. mysql 索引合并

    索引合并是mysql底层为我们提供的智能算法.本文就介绍了mysql 索引合并的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 索引合并是mysql底层为我们提 ...

  6. mysql中groupby会用到索引吗_开发人员不得不知的MySQL索引和查询优化

    本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有 MySQL 基础的开发人员. 索引相关 索引基数 基数是数据列所包含的不同值的数量,例如, ...

  7. mysql索引底层实现原理_mysql的索引底层之实现原理

    MySQL索引背后的数据结构及算法原理 一.定义 索引定义:索引(Index)是帮助MySQL高效获取数据的数据结构. 本质:索引是数据结构. 二.B-Tree m阶B-Tree满足以下条件: 1.每 ...

  8. 不会MySQL索引,面试官让回家等通知!

    " 你是不是对于 MySQL 索引的知识点一直都像大杂烩,好像什么都知道,如果进行深究的话可能一个也答不上来. 假如你去面试,面试官让你聊一下对索引的理解,然而你对索引的理解仅限于,检索数据 ...

  9. ElasticSearch 索引 VS MySQL 索引

    前言 这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 为此我搜索了 ...

  10. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

最新文章

  1. Kubernetes是什么
  2. Bit-Scalable Deep Hashing with Regularized Similarity Learning for Image Retrieval and Person Re-ide
  3. 拦截器HandlerInterceptor、ResponseBodyAdvice和@ExceptionHandler执行顺序
  4. (视频+图文)机器学习入门系列-第15章
  5. 关于Excel和Csv导入和导出工具使用
  6. ajax 局部页面替换innerhtml,ajax jquery 页面局部刷新的不同实现代码
  7. win10树莓派改ip_Window 10通过网线和Wifi连接树莓派
  8. asm字节码操作 方法的动态修改增加
  9. SAP License:SAP顾问是如何炼成的——SAP顾问的真实生活
  10. C语言基本语法——结构体、联合和枚举
  11. Day_1_Python_循环和格式化
  12. Ubuntu安装最新版nodejs
  13. python做服务器需要什么模块_用Python自带的包建立简单的web服务器
  14. 谷歌归期未定,但敏感词库已经建起来了
  15. 手机组态软件_安卓平板组态软件​_移动端组态
  16. Maven教程-使用Nexus搭建私服,Java基础视频
  17. 《面试补习》--来聊聊削峰填谷!
  18. 软件测试需要学什么?测试小白入门必看!
  19. axios请求中添加token,Authorization中添加token
  20. 抖音、猫眼网页信息加密分析与应对(1)

热门文章

  1. 服务器硬盘属于计算机哪一类,服务器和电脑虽然都是计算机,但却有很大区别,千万不要用错了...
  2. easyui框架前后端交互_Vue+ElementUI+.netcore前后端分离框架开发项目实战
  3. 剑指offer 算法 (位运算)
  4. 如何恢复Windows“消失”的磁盘分区
  5. js 闭包的用法详解
  6. Oracle管理表空间和数据文件详解
  7. pod出现include of non-modular header inside framework module 错误
  8. RunLoop总结:RunLoop的应用场景(五)
  9. ASP.NET Web - 服务器控件
  10. 【IT笔试面试题整理】字符串的排列