数据库 | 什么是视图?怎么使用?什么是索引?

目录

一、视图

1 、视图概念

2、为什么要使用视图

3 、性能问题

4 、定义视图

5、查看视图

6、删除视图

二、索引

1、引入索引的问题

2、索引是什么

3、索引为什么选择b+树


一、视图

1 、视图概念

        视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库 中实际存放数据,它的数据来自定义视图时使用的基本表,并且是在使用视图时动态生成的。

2、为什么要使用视图

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

3 、性能问题

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

4 、定义视图

        定义视图建议以"_v"开头

        create view 视图名 as select语句;

5、查看视图

show tables; 默认会显示表和视图,但不能区分。

show full tables; 会显示表和视图的类型

6、删除视图

drop view viewname

二、索引

1、引入索引的问题

        在图书馆查找一本书的过程。 在一般的软件系统中,对数据库的操作还是以查询为主,当数据量较大时,优化查询是关键。

        那么可以给所有的列都加上索引嘛?(面试题)
        其实不可以的,因为每添加一个索引就需要重新添加一颗b+树,如果所有的列都添加索引会导致插入和查询的成本变高,因此只需要在经常使用的列添加索引就是最好的。

2、索引是什么

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

        索引(在MySQL中也叫做“键(key)”) 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。
        索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但当数据量逐渐增大时,性能则会急剧下降。
        索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,“最优”的索引有时比一个“好的”索引性能要好两个数量级。创建一个真正“最优”的索引经常需要重写查询。

  • 索引是帮助mysql高效获取数据的数据结构
  • 索引存储在文件系统中
  • 索引的文件存储形式与存储引擎有关
  • 索引文件的结构

3、索引为什么选择b+树

        可以考虑作为索引的数据结构有如下几种:

  • hash表
  • 二叉树
  • b树
  • b+树(innoDB存储引擎上)使用b+树是因为b+树的高度稳定

        使用hash表的缺点:

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

测试索引

1)在mysql中创建数据库 test_indexdb,操作如下:

create database test_indexdb;

2)在test_indexdb中创建表 test_index,操作如下:

use test_indexdb;

create table test_index(title varchar(20));

3)运行程序向表中插入1万条数据,都是字符串, c程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
    MYSQL mysql_conn;//连接数据库句柄
    MYSQL * mysql = mysql_init(&mysql_conn);//初始化句柄mysql_conn
    if ( mysql == NULL )
    {
        printf("init err\n");
        exit(1);
    }
    //连接数据库                                                              
 mysql=mysql_real_connect(mysql,"localhost","root","Abc_111111","test_indexdb",3306,NUL
L,0);//连接本机localhost,用户为root,密码Abc_111111,数据库test_indexdb,端口3306
    if ( mysql == NULL )
    {
    printf("connect err\n");
    exit(1);
    }
    char sql_buff[128] = {0};
    for( int i = 0;i < 10000; i++ )
    {
        sprintf(sql_buff,"insert into test_index values('test-%d')",i);//待处理的执行语句存放入sql_buff内
        if ( mysql_query(mysql,sql_buff) != 0 )//执行sql语句mysql_query()
        {
            printf("insert into err:%s\n",mysql_error(mysql));//打印错误信息
            break;
        }
    }
    mysql_close(mysql);
}

4) 查询验证 开启运行时间监测:

set profiling=1;

查找一条数据 : test-9999

select * from test_index where title='test-9999';

查看执行的时间:

show profiles;

为表test_index的title列创建索引:

create index title_index on test_index(title(20));

执行查询语句后,再次查看执行时间

select * from t_index where title='test-9999';
show profiles;
mysql> show profiles;

删除索引

drop index t_index on test_index;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值