目录
一、视图
1 、视图概念
2、为什么要使用视图
3 、性能问题
4 、定义视图
5、查看视图
6、删除视图
二、索引
1、引入索引的问题
2、索引是什么
3、索引为什么选择b+树
一、视图
1 、视图概念
视图(View)是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的。视图并不在数据库 中实际存放数据,它的数据来自定义视图时使用的基本表,并且是在使用视图时动态生成的。
2、为什么要使用视图
- 简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道它的查询细节。
- 重复使用该sql语句。
- 使用表的组成部分而不是整个表。
- 保护数据,可以给用户授予表的特定部分的访问权限而不是整个表。
- 更改数据格式和表示。
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;