请问SQL中视图与查询的区别?

我知道视图是创建一个虚表,而且没有生成此表的关系,数据库中只知存有此表的定义。但查询又是怎样一会事呢,原理?它与视图区别?求解!... 我知道视图是创建一个虚表,而且没有生成此表的关系,数据库中只知存有此表的定义。
但查询又是怎样一会事呢,原理?它与视图区别?求解!
展开
 我来答
太平洋来的风
推荐于2017-11-25 · TA获得超过190个赞
知道小有建树答主
回答量:582
采纳率:100%
帮助的人:249万
展开全部
视图就是一条查询语句

视图使用起来就是一张表.但是只是单个基表的行列投影才可更新.

视图主要用到映射模式到外模式来使用.

还有有时查询子查询套用次数太多,也用视图来增加可读性
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sas117sbs
2012-06-20 · 超过46用户采纳过TA的回答
知道小有建树答主
回答量:110
采纳率:0%
帮助的人:120万
展开全部
查询是对数据库表数据的操作,而视图类似于呼转功能的中间站
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱可生云数据库
2020-06-01 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部

MySQL 8.0 推出了histogram,也叫柱状图或者直方图。先来解释下什么叫直方图。


关于直方图

我们知道,在DB中,优化器负责将SQL转换为很多个不同的执行计划,完了从中选择一个最优的来实际执行。但是有时候优化器选择的最终计划有可能随着DB环境的变化不是最优的,这就导致了查询性能不是很好。比如,优化器无法准确的知道每张表的实际行数以及参与过滤条件的列有多少个不同的值。那其实有时候有人就说了,索引不是可以解决这个问题吗?是的,不同类型的索引可以解决这个问题,但是你不能每个列都建索引吧?如果一张表有1000个字段,那全字段索引将会拖死对这张表的写入。而此时,直方图就是相对来说,开销较小的方法。

直方图就是在 MySQL 中为某张表的某些字段提供了一种数值分布的统计信息。比如字段NULL的个数,每个不同值出现的百分比、最大值、最小值等等。如果我们用过了 MySQL 的分析型引擎brighthouse,那对这个概念太熟悉了。

MySQL的直方图有两种,等宽直方图和等高直方图。等宽直方图每个桶(bucket)保存一个值以及这个值累积频率;等高直方图每个桶需要保存不同值的个数,上下限以及累计频率等。MySQL会自动分配用哪种类型的直方图,我们无需参与。

MySQL 定义了一张meta表column_statistics 来存储直方图的定义,每行记录对应一个字段的直方图,以json保存。同时,新增了一个参数histogram_generation_max_mem_size来配置建立直方图内存大小。

不过直方图有以下限制:

1. 不支持几何类型以及json。2. 不支持加密表和临时表。3. 不支持列值完全唯一。4. 需要手工的进行键值分布。

那我们来举个简单的例子说明直方图对查询的效果提升。


举例

表相关定义以及行数信息等:

  • mysql> show create table t2\G

  • *************************** 1. row ***************************

  • Table: t2

  • Create Table: CREATE TABLE `t2` (

  • `id` int(11) NOT NULL AUTO_INCREMENT,

  • `rank1` int(11) DEFAULT NULL,

  • `rank2` int(11) DEFAULT NULL,

  • `rank3` int(11) DEFAULT NULL,

  • `log_date` date DEFAULT NULL,

  • PRIMARY KEY (`id`),

  • KEY `idx_rank1` (`rank1`),

  • KEY `idx_log_date` (`log_date`)

  • ) ENGINE=InnoDB AUTO_INCREMENT=49140 DEFAULT CHARSET=utf8mb4 \

  • COLLATE=utf8mb4_0900_ai_ci STATS_PERSISTENT=1 STATS_AUTO_RECALC=0

  • 1 row in set (0.00 sec)

  • mysql> select count(*) from t2;

  • +----------+

  • | count(*) |

  • +----------+

  • | 30940 |

  • +----------+

  • 1 row in set (0.00 sec)

  • 同时对t2克隆了一张表t3

  • mysql> create table t3 like t2;

  • Query OK, 0 rows affected (0.13 sec)

  • mysql> insert into t3 select * from t2;

  • Query OK, 30940 rows affected (1.94 sec)

  • Records: 30940 Duplicates: 0 Warnings: 0

  • 给表t3列rank1和log_date 添加histogram

  • mysql> analyze table t3 update histogram on rank1,log_date;+--------+-----------+----------+-----------------------------------------------------+| Table | Op | Msg_type | Msg_text |+--------+-----------+----------+-----------------------------------------------------+| ytt.t3 | histogram | status | Histogram statistics created for column 'log_date'. || ytt.t3 | histogram | status | Histogram statistics created for column 'rank1'. |+--------+-----------+----------+-----------------------------------------------------+2 rows in set (0.19 sec)


  • 我们来看看histogram的分布状况

  • mysql> select json_pretty(histogram) result from information_schema.column_statistics where table_name = 't3' and column_name = 'log_date'\G*************************** 1. row ***************************result: { "buckets": [ [ "2018-04-17", "2018-04-20", 0.01050420168067227, 4 ], ... , [ "2019-04-14", "2019-04-16", 1.0, 3 ] ], "data-type": "date", "null-values": 0.0, "collation-id": 8, "last-updated": "2019-04-17 03:43:01.910185", "sampling-rate": 1.0, "histogram-type": "equi-height", "number-of-buckets-specified": 100}1 row in set (0.03 sec)


  • MySQL自动为这个字段分配了等高直方图,默认为100个桶。SQL A:

  • select count(*) from t2/t3 where (rank1 between 1 and 10) and log_date < '2018-09-01';


  • SQL A的执行结果:

  • mysql> select count(*) from t2/t3 where (rank1 between 1 and 10) and log_date < '2018-09-01';+----------+| count(*) |+----------+| 2269 |+----------+1 row in set (0.01 sec)


  • 无histogram的执行计划

  • mysql> explain format=json select count(*) from t2 where (rank1 between 1 and 10) and log_date < '2018-09-01'\G*************************** 1. row ***************************EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "2796.11" }, "table": { "table_name": "t2", "access_type": "range", "possible_keys": [ "idx_rank1", "idx_log_date" ], "key": "idx_rank1", "used_key_parts": [ "rank1" ], "key_length": "5", "rows_examined_per_scan": 6213, "rows_produced_per_join": 3106, "filtered": "50.00", "index_condition": "(`ytt`.`t2`.`rank1` between 1 and 10)", "cost_info": { "read_cost": "2485.46", "eval_cost": "310.65", "prefix_cost": "2796.11", "data_read_per_join": "72K" }, "used_columns": [ "rank1", "log_date" ], "attached_condition": "(`ytt`.`t2`.`log_date` < '2018-09-01')" } }}


  • 有histogram的执行计划

  • mysql> explain format=json select count(*) from t3 where (rank1 between 1 and 10) and log_date < '2018-09-01'\G*************************** 1. row ***************************EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "0.71" }, "table": { "table_name": "t3", "access_type": "range", "possible_keys": [ "idx_rank1", "idx_log_date" ], "key": "idx_log_date", "used_key_parts": [ "log_date" ], "key_length": "4", "rows_examined_per_scan": 1, "rows_produced_per_join": 1, "filtered": "100.00", "index_condition": "(`ytt`.`t3`.`log_date` < '2018-09-01')", "cost_info": { "read_cost": "0.61", "eval_cost": "0.10", "prefix_cost": "0.71", "data_read_per_join": "24" }, "used_columns": [ "rank1", "log_date" ], "attached_condition": "(`ytt`.`t3`.`rank1` between 1 and 10)" } }}1 row in set, 1 warning (0.00 sec)

  • 我们看到两个执行计划的对比,有Histogram的执行计划cost比普通的sql快了好多倍。上面文字可以看起来比较晦涩,贴上两张图,看起来就很简单了。我这里举得例子相对简单,有兴趣的朋友可以更深入学习其他复杂些的例子。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
糖糖寳寳
推荐于2016-07-14 · TA获得超过6.4万个赞
知道大有可为答主
回答量:1.8万
采纳率:92%
帮助的人:3832万
展开全部
  视图可以被看成是虚拟表或存储查询,可通过视图访问的数据不作为独特的对象存储在数据库内,数据库内存储的是 SELECT 语句,SELECT 语句的结果集构成视图所返回的虚拟表,用户可以用引用表时所使用的方法,在 Transact-SQL 语句中通过引用视图名称来使用虚拟表。
  使用视图可以实现下列任一或所有功能:
  将用户限定在表中的特定行上。
  例如,只允许雇员看见工作跟踪表内记录其工作的行。
  将用户限定在特定列上。
  例如,对于那些不负责处理工资单的雇员,只允许他们看见雇员表中的姓名列、办公室列、工作电话列和部门列,而不能看见任何包含工资信息或个人信息的列。
  将多个表中的列联接起来,使它们看起来象一个表。
  聚合信息而非提供详细信息。
  例如,显示一个列的和,或列的最大值和最小值。
  通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图。SELECT 语句引用的数据表称为视图的基表。在下例中,pubs 数据库中的 titleview 是一个视图,该视图选择三个基表中的数据来显示包含常用数据的虚拟表:
  CREATE VIEW titleview
  AS
  SELECT title, au_ord, au_lname, price, ytd_sales, pub_id
  FROM authors AS a
  JOIN titleauthor AS ta ON (a.au_id = ta.au_id)
  JOIN titles AS t ON (t.title_id = ta.title_id)
  之后,可以用引用表时所使用的方法在语句中引用 titleview。
  SELECT *
  FROM titleview 一个视图可以引用另一个视图。
  例如,titleview 显示的信息对管理人员很有用,但公司通常只在季度或年度财务报表中才公布本年度截止到现在的财政数字。
  可以建立一个视图,在其中包含除 au_ord 和 ytd_sales 外的所有 titleview 列。使用这个新视图,客户可以获得已上市的书籍列表而不会看到财务信息:
  CREATE VIEW Cust_titleview
  AS
  SELECT title, au_lname, price, pub_id
  FROM titleview
  
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式