mysql索引使用经验总结

栏目: 数据库 · 发布时间: 4年前

内容简介:比如邮箱或者身份证号的存储,使用前缀索引,前缀索引长度的选择。注意:对于区分度不太好的,例如身份证号。之后后面几位才有区分度。那么如何存储?

字符串创建索引(前缀索引)

比如邮箱或者身份证号的存储,使用前缀索引,前缀索引长度的选择。

select 
   count(distinct left(email,4)) as a,
   count(distinct left(email,4)) as b,
   count(distinct left(email,4)) as c,from table 复制代码

注意: 前缀索引会使覆盖索引失效 ,因为前缀索引只有部分数据,需要回表找到完整数据。

对于区分度不太好的,例如身份证号。之后后面几位才有区分度。那么如何存储?

  •   倒序存储之后取前缀索引
    • select * from table where card = reverse('card_string')复制代码
  • 使用hash字段存储 (查询的时候必须使用等于,精确匹配)
    • select * from t where card = crc32('card_string')复制代码

上面2个缺点是都不支持范围查询。

总结:

  • 直接创建索引,空间占用大。
  • 前缀索引,节省空间,但是覆盖索引会失效。
  • 对于前缀区分度不高的使用,倒序存储,不支持范围查询。
  • 创建hash字段索引,性能稳定,也不支持范围查询。

考虑一种场景:用户名+密码的登录。因为只有单数据查询没有范围查询场景,一般可以吧多个字段hash字后存储。

唯一索引和普通索引的选取

前提:在业务保证一致的情况下,如何选择?

查询

select * from where a = '1'; 复制代码

a为唯一索引:mysql会在a索引树上找到1这条数据的id,回表查出所有数据。

a为普通索引:mysql在a索引上找到1之后会接着找下一个,直到下一个不为1,然后同样回表查出数据返回。 如果查下一个数据的时候正好在下一页,会涉及到一次io,但是一个数据页一般会放进千个数据,索引概率相对较小。

更新

更新数据的时候,如果数据在数据页中就直接更新,否则存入change buffer中,就不会从磁盘中读取数据。下次查询访问数据也的时候,将数据也读入内存,执行change buffer 中与这个页面的merge操作。通过这种方式保证一致性。数据库也会定期执行merge操作。

update table set a = a+1  where xxx;复制代码

由上可知:

当更新的数据在内存中的话:

  • 唯一索引:判断数据唯一,直接更新内存数据。
  • 普通索引:直接更新内存数据。

更新数据不在内存:

  • 唯一索引:数据读入内存,(io)判断是否是否重复,不重复就插入
  • 普通索引:直接写change buffer  

场景:如果写入之后立马会读,就没必要使用change buffer 。反而增加维护成本。但是对于大数据量的写的操作,性能会有很大的提升。

隐式转换

由于数据库类型不匹配可能会涉及到隐式转换,隐式转换之后索引会失效。所以当创建了索引查询依旧很慢的时候,需要注意这一点。工作中也多次碰到过。

最左前缀索引

暂无。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java语言程序设计

Java语言程序设计

(美) Y. Daniel Liang / 李娜 / 机械工业出版社 / 2011-6 / 79.00元

本书是Java语言的经典教材,畅销多年不衰。本书全面整合了Java的特性,采用“先讲基础”的教学方式,循序渐进地介绍了程序设计基础、面向对象程序设计、GUI程序设计等。另外,本书还全面且深入地覆盖了一些高级主题,包括算法和数据结构、并发、网络、国际化、高级GUI、数据库和Web程序设计等。 本书中文版由《Java语言程序设计 基础篇》和《Java语言程序设计 进阶篇》组成。基础篇对应原书的第......一起来看看 《Java语言程序设计》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具