mysql的基本索引类型(MySQL 隔离数据列和前缀索引的使用总结)
mysql的基本索引类型
MySQL 隔离数据列和前缀索引的使用总结隔离数据列
通常,我们会发现查询语句会妨碍mysql使用索引。除非在查询语句中列是独立的,否则mysql不会使用这些列的索引。“隔离”的意思是索引列不应该成为表达式的一部分或者在一个查询函数体中。例如下面的例子就不会命中actor_id这个索引。
|
select `actor_id` from `actor` where `actor_id` + 1 = 2; |
对于人来说,很容易知道查询条件实际是actor_id = 4,但是mysql不会这么处理,因此养成简化where判决条件的习惯,这意味着索引列独立地在比较操作符的一侧。下面是另外一个普遍错误的案例:
|
select ... where to_days( current_date ) - to_days(date_col) <= 10; |
前缀索引和索引的选择性
有时候需要在很长字符的列上建立索引,但这样会导致索引占据的空间很大且查询变慢。一个策略是使用哈希索引模拟,但有时候这未必是足够好,这个时候该怎么做?
通常是可以将索引列前面的部分字符建立索引来替换全字段索引提高性能和节省空间。但这种方式会使得选择性变差。索引的选择性是指独立的索引值筛选出的数据占整个数据集合的比例。高选择性的索引可以让mysql过滤掉更多无关的数据。例如,一个唯一索引的选择性是1。 列的前缀通常在选择性方面已经能够提供足够好的性能。如果使用blob或text或非常长的varchar字段列,你必须定义前缀索引,以为mysql不允许做全长度索引。
你需要在使用更长的前缀以获得更好的选择性和足够短的前缀以节省存储空间之间平衡。为了确定一个合适的前缀长度,查找出最高频的值,然后和最频繁的前缀进行比较。例如以城市数据表为例,我们可以使用如下的语句统计:
|
select count (*) as cnt, ` name ` from `common_city` group by ` name ` order by cnt desc limit 10 |
可以看到这些城市名称出现的次数比较多。现在我们可以使用1个字的前缀查找最为频繁的城市名称前缀。
|
select count (*) as cnt, left (` name `, 1) as pref from `common_city` group by pref order by cnt desc limit 10 |
可以看到1个字找出来的数据集更多了,这会导致独立选中的机会越少,因此需要调整一下前缀的长度。例如调到3个字。
|
select count (*) as cnt, left (` name `, 3) as pref from `common_city` group by pref order by cnt desc limit 10 |
可以看到这和全长度的相差不多,那实际三个字的前缀就够了(原文使用的是英文城市数据表,字符会更多)。另外一种方式是使用不同长度的前缀数量与全字段数量的比例评估多少合适。例如:
|
select count ( distinct left (` name `, 1)) / count (` name `) as pref1, count ( distinct left (` name `, 2)) / count (` name `) as pref2, count ( distinct left (` name `, 3)) / count (` name `) as pref3, count ( distinct left (` name `, 4)) / count (` name `) as pref4 from `common_city` |
数值越接近于1效果越好,但是也可以看到,随着前缀长度的加长改善的空间越小。只看平均值并不是一个好主意,还需要检查一下最坏情况。也许会觉得3-4个字足够了,但是如果数据分布很不均匀,那可能会存在陷阱。因此还需要检查一下前缀少的是不是存在一个前缀对应的数据与其他相比极其多的情况。最后可以给指定的列加前缀索引。
|
alter table `common_city` add key ( name (3)); |
前缀索引在节省空间和提高效率方面表现不错,但是也有缺陷,那就是在order by和group by上无法使用索引(实际验证在mysql 5.7以上版本也有用)。另外一种常见的场景是在较长的十六进制字符串中,例如存储的sessionid,取前8位前缀做索引将过滤很多无关数据,效果很好。
以上就是mysql 隔离数据列和前缀索引的使用总结的详细内容,更多关于mysql 隔离数据列和前缀索引的资料请关注开心学习网其它相关文章!
- mysql字符类型长度限制
- mysql 使用小结(Mysql Online DDL的使用详解)
- mysql索引如何使用(MySQL 索引和数据表该如何维护)
- mysql获取随机数(MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法)
- django操作默认数据库(Django数据库类库MySQLdb使用详解)
- php考试复习题(php+mysql开发的最简单在线题库在线做题系统完整案例)
- mysql 多表连接查询(MySQL多表查询的具体实例)
- mysql修改表内字段的数据类型(mysql修改记录时update操作 字段=字段+字符串)
- mysql数据表实例教程(mysql数据库入门第一步之创建表)
- mysql数据类型和使用方法(MySQL数据类型全解析)
- mysql中怎么删除整张表(MySQL如何优雅的删除大表实例详解)
- mysql 临时表
- mysql双主状态不一致(MySQL GTID主备不一致的修复方案)
- mysql和explain哪个好(MySQL EXPLAIN输出列的详细解释)
- mysql常用数据模型(MySQL数据库基于sysbench实现OLTP基准测试)
- 适合小白入门的mysql教程索引简介(一篇带给你MySQL高性能索引)
- 金球奖只青睐那些会戴珠宝的女人(金球奖只青睐那些会戴珠宝的女人)
- 浙江省一个县,人口超40万,建县历史超1100年(浙江省一个县人口超40万)
- 五代十国南唐历代国君(五代十国南唐历代国君)
- 飞机引进工程师杨隆 匠人匠心,只争朝夕(飞机引进工程师杨隆)
- 三人行,她们是育人路上的 铁三角 团队(她们是育人路上的)
- 阴阳师 孟婆山兔CP不倒 新皮肤草稿 孟婆兔 让痒痒鼠点赞(阴阳师孟婆山兔CP不倒)
热门推荐
- 织梦自定义属性设置(织梦 DeDeCMS 添加自定义属性的方法图文教程)
- pycharm 爬虫的数据存在哪了(利用PyCharm Profile分析异步爬虫效率详解)
- 如何打开mysql8.0客户端服务(MySQL mysqladmin客户端的使用简介)
- .NET中对枚举的操作
- thinkphp5单例原理(Thinkphp5框架简单实现钩子Hook行为的方法示例)
- dedecms5.7后台内链如何制作(DEDECMS教程之loop循环标签的使用详解)
- vue2.0自定义指令(vue2实现provide inject传递响应式)
- 小程序ui图与移动ui(AmazeUI 缩略图的实现示例)
- 如何使用自定义discuz代码(Apache,IIS下Discuz x1.5伪静态设置方法)
- extjs accordion折叠布局
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9