前缀索引
索引 前缀
2023-06-13 09:11:44 时间
大家好,又见面了,我是你们的朋友全栈君。
当索引是很长的字符序列时,这个索引将会很占内存,而且会很慢,这时候就会用到前缀索引了。所谓的前缀索引就是去索引的前面几个字母作为索引,但是要降低索引的重复率,索引我们还必须要判断前缀索引的重复率。先看这样一张表:
mysql> select * from test;
+----------+-------+
| name | score |
+----------+-------+
| zhangsan | 123 |
| wangwu | 345 |
| zhaoliu | 234 |
| lisisi | 687 |
+----------+-------+
4 rows in set (0.08 sec)
如果以name作为索引,当name对应的字符串很长时,就要考虑索引的占用空间和效率问题。这时候就需要引入前缀索引,在使用前缀索引时,首先要去比较重复率。
mysql> select 1.0*count(distinct name)/count(*) from test;
+-----------------------------------+
| 1.0*count(distinct name)/count(*) |
+-----------------------------------+
| 1.00000 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,2))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,2))/count(*) |
+-------------------------------------------+
| 0.75000 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,1))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,1))/count(*) |
+-------------------------------------------+
| 0.75000 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,3))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,3))/count(*) |
+-------------------------------------------+
| 0.75000 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,4))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,4))/count(*) |
+-------------------------------------------+
| 1.00000 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,2))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,2))/count(*) |
+-------------------------------------------+
| 0.75000 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> select 1.0*count(distinct left(name,5))/count(*) from test;
+-------------------------------------------+
| 1.0*count(distinct left(name,5))/count(*) |
+-------------------------------------------+
| 1.00000 |
+-------------------------------------------+
1 row in set (0.00 sec)
其中left函数为字符串截取函数。
select 1.0*count(distinct name)/count(*) from test这是比较整个name的重复率,当时这是最好的情况。然后分别截取name字符的前几个字母,最后选取的计算值要接近整个取整个name时得出的计算值,然后再选中占用空间小的。由上面执行的结果可知应选中name的前4个字母作为索引最为适合。
创建索引:
mysql> alter table test add key(name(4));
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0
随后就可以正常按name字符进行查找了。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142153.html原文链接:https://javaforall.cn
相关文章
- mysql 前缀索引_MySQL前缀索引
- mysql8不需要前缀即可走索引?
- 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )
- SQL开发知识:详解Mysql索引的前缀原则
- 关于MongoDB索引管理-索引的创建、查看、删除操作详解
- mysql索引类型normal,unique,full text详解数据库
- 构建Oracle表空间索引的方法(oracle表空间索引)
- 优化Mysql数据处理加速:基于前缀索引的优化(mysql的前缀索引)
- 建立Oracle集合的下标索引(oracle集合下标)
- Oracle 数据库中的主键与索引简介(oracle主键和索引)
- 优化Oracle数据库性能:索引维护之道(oracle 索引 维护)
- MSSQL视图中如何创建有效的索引(mssql 视图创建索引)
- 引擎MSSQL索引缓存引擎优化性能的突破性技术(mssql 索引缓存)
- 提高查询效率,了解MySQL不等索引优化策略(mysql不等 索引)
- gridview行索引获取方法及实现代码