MySQL数据库(四):视图和索引

2024-06-24 11:52

本文主要是介绍MySQL数据库(四):视图和索引,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在数据库管理中,视图和索引是两种关键工具,它们各自发挥独特的作用以优化数据查询和管理。视图通过简化复杂查询、提高数据安全性和提供数据抽象,帮助用户轻松访问数据。而索引则通过加速查询、确保数据唯一性以及优化排序和分组操作,显著提升数据库性能。理解和合理运用这两者,对数据库系统的高效运行至关重要。

目录

一、视图概念(面试)

二、视图的作用(面试)

三、视图的创建和使用

3.1 定义视图

3.2 查看视图

3.3 删除视图

3.3  性能问题

四、索引

4.1 引入索引的原因(面试题)

4.2 索引是什么(面试题)

4.3 索引为什么选择b+树(面试题)

4.4 测试索引

4.5 面试题


一、视图概念(面试)

      在MySQL中,视图(View)是一种虚拟表它本质上是基于一个或多个表的查询结果,并以表的形式展示出来。视图并不实际存储数据,而是存储查询语句,当你访问视图时,MySQL 会执行这条查询语句并返回结果。

二、视图的作用(面试)

  1. 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。
  2. 重复使用该sql语句。
  3. 使用表的组成部分而不是整个表。
  4. 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表。
  5. 更改数据格式和表示。

视图在数据库管理和操作中有许多重要的作用:

  1. 简化复杂查询

    • 通过创建视图,可以将复杂的查询逻辑封装在视图中。用户在需要使用这些复杂查询时,只需简单地查询视图,而不需要重复编写复杂的SQL代码。
    • 例如,如果你经常需要对多个表进行联合查询,可以创建一个视图来封装这些联合查询。
  2. 提高数据安全性

    • 视图可以限制用户访问特定的数据。通过视图,你可以只展示数据表中的某些列或行,而隐藏其他部分,从而保护敏感数据。
    • 例如,你可以创建一个视图,只显示员工的名字和部门,而不包括工资信息,这样可以限制普通用户对工资信息的访问。
  3. 数据独立性

    • 视图可以屏蔽底层表结构的变化,使得应用程序代码对表结构的变更不敏感。即使底层表结构发生变化,只要视图定义不变,应用程序代码也无需修改。
    • 例如,如果你对原始表的结构进行了调整,可以通过调整视图定义来保证原有的查询语句仍然可以正常工作。
  4. 简化权限管理

    • 通过视图,你可以为用户分配更细粒度的权限。你可以授予用户对视图的访问权限,而不需要授予他们对底层表的访问权限,从而实现更精细的权限控制。
    • 例如,你可以创建一个视图,只展示特定用户权限范围内的数据,并将访问权限分配给这些用户。

三、视图的创建和使用

3.1 定义视图

定义视图建议以"_v"开头,create view 视图名 as select语句;

3.2 查看视图

  1. show tables; 默认会显示表和视图,但不能区分。
  2. show full tables; 会显示表和视图的类型

3.3 删除视图

3.3  性能问题

         因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任一个检索。如果是多 个联结和过滤创建了复杂的视图或者嵌套了视图,可能会出现性能下降。即先在基本表中进行查询,然后再在里面进行二次查询。

四、索引

4.1 引入索引的原因(面试题)

         在MySQL中,索引是一种用于提高数据库查询速度的数据结构。它类似于一本书的目录,通过在表中为一个或多个列创建索引,可以大大加快数据检索的速度。就好像在图书馆查找一本书的过程。

4.2 索引是什么(面试题)

         索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针。简单讲,就像一本书前面的目 录, 能加快查询速度。

  1. 索引是帮助mysql高效获取数据的数据结构
  2. 索引存储在文件系统中
  3. 索引的文件存储形式与存储引擎有关,存储引擎的数据结构是B+树

4.3 索引为什么选择b+树(面试题)

       可以考虑作为索引的数据结构有如下几种,下面介绍下不同数据结构的特点:

  1. hash表
  2. 二叉树
  3. b树
  4. b+树

       使用hash表的缺点: 1)hash存储需要将所有的数据文件添加到内存,浪费空间 2)如果是等值查询,hash很快,但实际工作中范围查找更多,而不是等值查询,所以hash就不合适 了

4.4 测试索引

         在c2024db数据库中创建表 test_index表,表只有一列,运行程序向表中插入1万条数据,都是字符串,对比不使用索引和使用索引的情况下,查询某一条记录所花费的时间。

1、创建表:

2、运行如下程序向表中插入1万条数据:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <mysql/mysql.h>int main()
{//1、创建连接句柄MYSQL mysql_con;//句柄实际是一个结构体//2、初始化连接句柄MYSQL*mysql=mysql_init(&mysql_con);if(mysql==NULL){printf("mysql init err\n");exit(1);}//3、连接数据库服务端:连接句柄、用户名字、密码、ip地址、端口、数据库名字、标志位给0,指针给NULLmysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c2024db",3306,NULL,0);if(mysql==NULL){printf("连接失败\n");exit(1);}printf("连接成功\n");//4、循环插入10000条数据char buff[128]={0};for(int i=0;i<10000;i++){sprintf(buff,"insert into testindex value( ' index-%d')",i) ;if (mysql_ query (mysql,buff)!=0){printf("插入失败\n");exit(1) ;}}//5、关闭连接mysql_close(mysql);exit(0);
}

3、 开启运行时间监测

4、查找一条数据

5、为表test_index的title列创建索引

6、执行查询语句后,查看执行时间

4.5 面试题

1、索引未命中

       在表的某一列加上索引,然后查询时用的是没加索引的那一列进行查询,这就叫索引未命中,就是查询的时候,并没有使用所加的索引。

2、是不是给所有列加上索引就可以提高效率?

       不是这样的,因为创建索引时,要给加上索引的那一列创建b+树,所以每一列都要创建b+树,虽然查询很快,但是插入数据时很麻烦,插入一行数据,全部的b+树都要添加数据。所以我们一般给查询比较多的那一列加上b+树。

至此,数据库第四节就已经介绍完毕,感谢大家的阅读,更多精彩内容见后期,下期再见!

这篇关于MySQL数据库(四):视图和索引的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090078

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID