[原创]状态值在数据库中的检索

简介:

对于关系型数据库而言,针对表的检索,一般来说,建立合适的索引就可以达到很好的检索效果。(这里不包含表设计的合理与否)

比如像状态列这样可选择性非常低的值,该如何检索?  其实这个已经不是关系型数据库擅长的方面了。 但是如果出于历史或者许多不可抗拒的原因,

我们还得在关系表中进行优化,该咋办?   一般来说,就是建立静态表。 但是静态表也是多重多样,该如何选择? 我下面列举几个简单的例子,当然了,

由于个人的脑子尺度不够大,有可能有些遗漏。


原始表。

20 完条记录, 大概36MB大小。

1
t_girl> create  table  rank_status (id  integer  not  null , i_status  varchar (3)  not  null );


第一种呢,就是建立LIST 表,这种表,可以当做静态表,也可以当做原始表来做相关的更新。

只有2条记录,大概720KB大小。

1
t_girl> create  table  rank_status_extend (i_status  varchar (3)  not  null , ids text);


我们可以对两张表都做对应的更新操作。


插入一条记录。

1
2
3
4
t_girl>  insert  into  rank_status  values  (222222, 'yes' );
Time : 4.397 ms
t_girl> update  rank_status_extend  set  ids = ids || ',' || '222222'  where  i_status =  'yes' ;
Time : 43.725 ms

删除一条记录。

1
2
3
4
t_girl> delete  from  rank_status  where  i_status =  'yes'  and  id = 1;
Time : 47.339 ms
t_girl> update  rank_status_extend  set  ids =  replace (ids, ',1,' , ',' where  i_status =  'yes' ;
Time : 45.046 ms


更新一条记录。

1
2
3
4
t_girl> update  rank_status  set  id = 1000  where  i_status =  'yes'  and  id = 20;
Time : 65.834 ms
t_girl> update  rank_status_extend  set  ids =  replace (ids, ',20,' , ',1000,' where  i_status =  'yes' ;
Time : 85.974 ms


我们看到,在对表的写操作中,第二张表会比第一张慢一点。


其实我们最主要的是关心读操作。其实在读上面还是很有优势的。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
t_girl> select  count (*)  as  total  from  rank_status  where  i_status =  'yes' ;                            
  total
-------
  99600
(1 row)
Time : 86.563 ms
t_girl> select  length(ids) - length( replace (ids, ',' , '' )) + 1  as  total  from  rank_status_extend  where  i_status =  'yes' ;
  total
-------
  99600
(1 row)
Time : 35.762 ms
t_girl> select  string_agg(id::text, ',' ),i_status  from  rank_status  group  by  i_status;
Time : 113.393 ms
t_girl> select  ids  from  rank_status_extend  where  i_status =  'yes' ;
Time : 2.447 ms



接下来第二种呢,就是分别建立两张表, 但是这两张表呢,少了存放状态值的字段,所以在尺寸上小了很多。

1
2
3
4
t_girl> create  table  rank_status_yes (id  int  not  null );
  3552 kB
t_girl> create  table  rank_status_no(id  int  not  null );
  3584 kB

当然这张表的检索肯定比原始表来的快,这里,我就不演示了。


第三种呢,就是建立一张物化视图,

1
t_girl> create  materialized  view  mv_rank_status_yes  as  select  from  rank_status  where  i_status =  'yes' ;

这种其实和第二种表很类似。只不过不同的是第二种表的维护需要人工来做,而这个视图系统可以维护。







本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1366344,如需转载请自行联系原作者
相关文章
|
7天前
|
存储 机器学习/深度学习 人工智能
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
RAG:AI大模型联合向量数据库和 Llama-index,助力检索增强生成技术
|
14天前
|
存储 算法 数据库
矢量数据库在图像识别与检索中的应用实践
【4月更文挑战第30天】本文探讨了矢量数据库在图像识别与检索中的应用,通过特征提取(如SIFT、SURF)、编码和相似度度量实现快速识别。在图像检索流程中,经过预处理、特征提取和编码后,矢量数据库用于查询相似特征,排序后展示给用户。实际案例显示,矢量数据库能提升电商平台的商品图像搜索效率和用户体验。随着技术发展,这一领域应用前景广阔。
|
2月前
|
存储 机器学习/深度学习 自然语言处理
Yuan2.0大模型,联合向量数据库和Llama-index,助力检索增强生成技术
本文将以Yuan2.0最新发布的Februa模型为例进行测试验证,用更小规模的模型达到更好的效果。
|
3月前
|
存储 数据库连接 数据库
数据存储与检索:Python 与数据库的交互
在当今的数据驱动世界中,有效地存储和检索数据是至关重要的。Python 作为一种强大的编程语言,提供了多种方式与数据库进行交互,使得处理和管理数据变得更加便捷。在本文中,我们将探讨 Python 与数据库交互的基本概念和技术,包括使用 Python 的数据库驱动程序、连接数据库、执行查询和操作数据等。
|
5月前
|
SQL Oracle 关系型数据库
SQL CREATE INDEX 语句- 提高数据库检索效率的关键步骤
SQL CREATE INDEX 语句用于在表中创建索引。 索引用于比其他方式更快地从数据库中检索数据。用户无法看到索引,它们只是用于加速搜索/查询。 注意: 使用索引更新表比不使用索引更新表需要更多的时间(因为索引也需要更新)。因此,只在经常进行搜索的列上创建索引。
53 5
|
SQL 关系型数据库 MySQL
数据库教程:项目4 MySQL数据表的检索总结
MySQL数据库 “数据表的检索总结” 习题示例,包含源码,能建立起对于数据表的检索的基本概念
108 0
|
SQL 存储 关系型数据库
【数据库原理及应用】MySQL数据表的检索
MySQL数据表的检索的基本语句
174 0
|
关系型数据库 MySQL 数据库
mysql数据库(7):表中检索信息(下)
mysql数据库(7):表中检索信息
108 0
mysql数据库(7):表中检索信息(下)
|
关系型数据库 MySQL 数据库
mysql数据库(7):表中检索信息(上)
mysql数据库(7):表中检索信息
141 0
mysql数据库(7):表中检索信息(上)
|
Oracle 关系型数据库 Linux
Linux系统中Oracle数据库使用SELECT语句检索数据(1)实例应用
1,首先切换到Oracle用户,并进入数据库#sql / as sysdba2,启动数据库,并连接样例及表格,启动命令#startup,连接样例#conn scott/tiger3,select语句中:不区分大小写;可以写一行或多行,为方便查看最好每个子句单独一行;语句以“;”结尾结束语句4,se.