ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL数据库-索引和视图 [打印本页]

作者: 卖不甜枣    时间: 2024-10-14 18:05
标题: MySQL数据库-索引和视图
一、视图

1.什么是视图


2.为什么需要视图

例如常常要对student和score表进行连接查询,每次都要做表的连接,写同样的一串语句,同时由于结果 数据比力敏感,对外要求不可见。对这样的题目就可以通过视图来解决。
3.视图的作用和优点

(1)作用:

(2)优点:

4.创建视图

(1)语法
  1. create [or replace] [algorithm = {undefined | merge | temptable}]
  2.     view view_name [(column_list)]
  3.     as select_statement
  4.     [with [cascaded | local] check option]
  5. # 说明:
  6.     1、or replace:如果要创建的视图名称已存在,则替换已有视图。
  7.     2、algorithm:可选参数,表示视图选择的算法,默认算法是 undefined
  8.         (1)undefined:未定义指定算法
  9.         (2)merge:更新视图表数据的同时会更新真实表的数据
  10.         (3)temptable:只能查询不能更新
  11.     3、view_name:新建的视图名称。
  12.     4、column_list:可选,表示视图的字段列表。若省略,则使用 select 语句中的字段列表。
  13.     5、as select_statement:创建视图的 select 语句。
  14.     6、with check option:表示更新视图时要保证该视图的 where 子句为真。
  15.         比如定义视图:create view v1 as select * from salary > 5000;
  16.         如果要更新视图,则必须保证 salary 字段的值在 5000 以上,否则报错。
  17.         (1)cascaded:必须满足所有针对该视图的条件才可以更新
  18.         (2)local:只需满足本视图的条件就可以更新
复制代码
(2)示例

  1. mysql> select * from student;
  2. +------+--------+------+------+---------+------------+
  3. | sno  | sname  | ssex | sage | monitor | birth      |
  4. +------+--------+------+------+---------+------------+
  5. | s001 | 张玲丽 | 女   |   20 | s010    | 2009-12-03 |
  6. | s002 | 吴鹏   | 男   |   19 | s010    | 2009-10-11 |
  7. | s003 | 李锐   | 男   |   19 | s003    | 2008-02-13 |
  8. | s004 | 赵丁雯 | 女   |   21 | s003    | 2008-06-24 |
  9. | s005 | 陈晓晓 | 女   |   18 | s005    | 2009-07-26 |
  10. | s006 | 孙德胜 | 男   |   22 | s005    | 2009-05-25 |
  11. | s007 | 刘琦玉 | 男   |   20 | s005    | 2009-06-21 |
  12. | s008 | 李波   | 男   |   20 | s005    | 2009-10-21 |
  13. | s009 | 李晨   | 男   |   19 | s010    | 1998-03-30 |
  14. | s010 | 王子涵 | 女   |   23 | s010    | 2007-05-01 |
  15. | s011 | 孙德胜 | 女   |   24 | s010    | 2008-05-25 |
  16. +------+--------+------+------+---------+------------+
  17. 11 rows in set (0.00 sec)
  18. mysql> select * from sc;
  19. +------+------+-------+
  20. | sno  | cno  | score |
  21. +------+------+-------+
  22. | s001 | c001 | 85.65 |
  23. | s001 | c002 | 77.45 |
  24. | s001 | c003 | 60.00 |
  25. | s002 | c002 | 72.35 |
  26. | s003 | c001 | 74.12 |
  27. | s003 | c002 | 85.05 |
  28. | s004 | c001 | 45.50 |
  29. | s005 | c001 | 99.00 |
  30. +------+------+-------+
  31. 8 rows in set (0.00 sec)
复制代码

  1. mysql> create view v_student as select sno,sname,ssex,year(now())-year(birth) as age from student;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> select * from v_student;
  4. +------+--------+------+------+
  5. | sno  | sname  | ssex | age  |
  6. +------+--------+------+------+
  7. | s001 | 张玲丽 | 女   |   15 |
  8. | s002 | 吴鹏   | 男   |   15 |
  9. | s003 | 李锐   | 男   |   16 |
  10. | s004 | 赵丁雯 | 女   |   16 |
  11. | s005 | 陈晓晓 | 女   |   15 |
  12. | s006 | 孙德胜 | 男   |   15 |
  13. | s007 | 刘琦玉 | 男   |   15 |
  14. | s008 | 李波   | 男   |   15 |
  15. | s009 | 李晨   | 男   |   26 |
  16. | s010 | 王子涵 | 女   |   17 |
  17. | s011 | 孙德胜 | 女   |   16 |
  18. +------+--------+------+------+
  19. 11 rows in set (0.00 sec)
复制代码

  1. mysql> create view v_score as select student.*,score from student
  2. join sc on student.sno=sc.sno;
  3. Query OK, 0 rows affected (0.01 sec)
  4. mysql> select * from v_score;
  5. +------+--------+------+------+---------+------------+-------+
  6. | sno  | sname  | ssex | sage | monitor | birth      | score |
  7. +------+--------+------+------+---------+------------+-------+
  8. | s001 | 张玲丽 | 女   |   20 | s010    | 2009-12-03 | 60.00 |
  9. | s001 | 张玲丽 | 女   |   20 | s010    | 2009-12-03 | 77.45 |
  10. | s001 | 张玲丽 | 女   |   20 | s010    | 2009-12-03 | 85.65 |
  11. | s002 | 吴鹏   | 男   |   19 | s010    | 2009-10-11 | 72.35 |
  12. | s003 | 李锐   | 男   |   19 | s003    | 2008-02-13 | 85.05 |
  13. | s003 | 李锐   | 男   |   19 | s003    | 2008-02-13 | 74.12 |
  14. | s004 | 赵丁雯 | 女   |   21 | s003    | 2008-06-24 | 45.50 |
  15. | s005 | 陈晓晓 | 女   |   18 | s005    | 2009-07-26 | 99.00 |
  16. +------+--------+------+------+---------+------------+-------+
  17. 8 rows in set (0.00 sec)
复制代码

  1. mysql> create or replace view v_avg(sex,avg_score) as select ssex
  2. ,round(avg(score),2) from student inner join sc on student.sno=sc
  3. .sno group by ssex;
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> select * from v_avg;
  6. +------+-----------+
  7. | sex  | avg_score |
  8. +------+-----------+
  9. | 女   |     73.52 |
  10. | 男   |     77.17 |
  11. +------+-----------+
  12. 2 rows in set (0.00 sec)
复制代码
5.更新视图

更新视图中的数据,现实上是更新创建视图时用到的基本表中的数据
(1)以下视图不可更新:

(2)示例

  1. mysql> create or replace view v_age as select sno,sname,ssex,sage
  2. from student where sage>20 with check option;    # 增加限制更新参数
  3. Query OK, 0 rows affected (0.01 sec)
  4. mysql> select * from v_age;
  5. +------+--------+------+------+
  6. | sno  | sname  | ssex | sage |
  7. +------+--------+------+------+
  8. | s004 | 赵丁雯 | 女   |   21 |
  9. | s006 | 孙德胜 | 男   |   22 |
  10. | s010 | 王子涵 | 女   |   23 |
  11. | s011 | 孙德胜 | 女   |   24 |
  12. +------+--------+------+------+
  13. 4 rows in set (0.00 sec)
  14. mysql> update v_age set sage=24 where sno='s011';    # 符合条件更新视图
  15. Query OK, 0 rows affected (0.00 sec)
  16. Rows matched: 1  Changed: 0  Warnings: 0
  17. mysql> select * from student;    # 查看视图的基本表,数据已变更
  18. +------+--------+------+------+---------+------------+
  19. | sno  | sname  | ssex | sage | monitor | birth      |
  20. +------+--------+------+------+---------+------------+
  21. | s001 | 张玲丽 | 女   |   20 | s010    | 2009-12-03 |
  22. | s002 | 吴鹏   | 男   |   19 | s010    | 2009-10-11 |
  23. | s003 | 李锐   | 男   |   19 | s003    | 2008-02-13 |
  24. | s004 | 赵丁雯 | 女   |   21 | s003    | 2008-06-24 |
  25. | s005 | 陈晓晓 | 女   |   18 | s005    | 2009-07-26 |
  26. | s006 | 孙德胜 | 男   |   22 | s005    | 2009-05-25 |
  27. | s007 | 刘琦玉 | 男   |   20 | s005    | 2009-06-21 |
  28. | s008 | 李波   | 男   |   20 | s005    | 2009-10-21 |
  29. | s009 | 李晨   | 男   |   19 | s010    | 1998-03-30 |
  30. | s010 | 王子涵 | 女   |   23 | s010    | 2007-05-01 |
  31. | s011 | 孙德胜 | 女   |   24 | s010    | 2008-05-25 |
  32. +------+--------+------+------+---------+------------+
  33. 11 rows in set (0.00 sec)
  34. mysql> update v_age set sage=18 where sno='s011';    # 不符合条件更新视图,报错!
  35. ERROR 1369 (HY000): CHECK OPTION failed 'mydb9_stusys.v_age'
复制代码

  1. mysql> select * from v_student;
  2. +------+--------+------+------+
  3. | sno  | sname  | ssex | age  |
  4. +------+--------+------+------+
  5. | s001 | 张玲丽 | 女   |   15 |
  6. | s002 | 吴鹏   | 男   |   15 |
  7. | s003 | 李锐   | 男   |   16 |
  8. | s004 | 赵丁雯 | 女   |   16 |
  9. | s005 | 陈晓晓 | 女   |   15 |
  10. | s006 | 孙德胜 | 男   |   15 |
  11. | s007 | 刘琦玉 | 男   |   15 |
  12. | s008 | 李波   | 男   |   15 |
  13. | s009 | 李晨   | 男   |   26 |
  14. | s010 | 王子涵 | 女   |   17 |
  15. | s011 | 孙德胜 | 女   |   16 |
  16. +------+--------+------+------+
  17. 11 rows in set (0.00 sec)
  18. mysql> update v_student set age=30 where sno='s001';    # 报错!
  19. ERROR 1348 (HY000): Column 'age' is not updatable
复制代码

  1. mysql> select * from v_avg;
  2. +------+-----------+
  3. | sex  | avg_score |
  4. +------+-----------+
  5. | 女   |     73.52 |
  6. | 男   |     77.17 |
  7. +------+-----------+
  8. 2 rows in set (0.00 sec)
  9. mysql> update v_avg set avg_score=80 where sex='女';    # 报错!
  10. ERROR 1288 (HY000): The target table v_avg of the UPDATE is not updatable
复制代码
6.视图利用规则


7.修改视图

(1)通过create or replace view 下令修改视图
  1. mysql> desc v_student;
  2. +-------+---------+------+-----+---------+-------+
  3. | Field | Type    | Null | Key | Default | Extra |
  4. +-------+---------+------+-----+---------+-------+
  5. | sno   | char(4) | YES  |     | NULL    |       |
  6. | sname | char(4) | YES  |     | NULL    |       |
  7. | ssex  | char(2) | YES  |     | NULL    |       |
  8. | age   | int     | YES  |     | NULL    |       |
  9. +-------+---------+------+-----+---------+-------+
  10. 4 rows in set (0.00 sec)
  11. mysql> create or replace view v_student as select sno,sname,ssex,
  12. sage from student;    # 将age直接读取
  13. Query OK, 0 rows affected (0.01 sec)
  14. mysql> desc v_student;
  15. +-------+---------+------+-----+---------+-------+
  16. | Field | Type    | Null | Key | Default | Extra |
  17. +-------+---------+------+-----+---------+-------+
  18. | sno   | char(4) | YES  |     | NULL    |       |
  19. | sname | char(4) | YES  |     | NULL    |       |
  20. | ssex  | char(2) | YES  |     | NULL    |       |
  21. | sage  | int     | YES  |     | NULL    |       |
  22. +-------+---------+------+-----+---------+-------+
  23. 4 rows in set (0.00 sec)
复制代码
(2)通过alter view 下令修改视图
  1. mysql> alter view v_student as select sno,sname,ssex,sage from st
  2. udent where ssex='女';
  3. Query OK, 0 rows affected (0.01 sec)
  4. mysql> select * from v_student;
  5. +------+--------+------+------+
  6. | sno  | sname  | ssex | sage |
  7. +------+--------+------+------+
  8. | s001 | 张玲丽 | 女   |   20 |
  9. | s004 | 赵丁雯 | 女   |   21 |
  10. | s005 | 陈晓晓 | 女   |   18 |
  11. | s010 | 王子涵 | 女   |   23 |
  12. | s011 | 孙德胜 | 女   |   24 |
  13. +------+--------+------+------+
  14. 5 rows in set (0.00 sec)
复制代码
8.删除视图

  1. drop view [if exists] view_name;
复制代码
二、索引

1.什么是索引

索引是一种特别的文件,用来快速查询数据库表中的特定纪录,是进步数据库性能的紧张方式,通俗的说,数据库索引比如是一本书前面的目录,能加速数据库的查询速度。
2.索引特点


3.索引分类

(1)按照算法分类:




(2)按照功能分类:

常用索引:

4.索引优缺点

优点:

缺点:

5.索引的设计原则

为了使索引的利用效率更高,在创建索引的时候必须考虑在哪些字段上创建索引和创建什么类型的索引。
设计原则:

6.创建索引

(1)创建表的时候创建索引
  1. create table 表名 (
  2.             字段名1 数据类型 [完整性约束条件…],
  3.             字段名2 数据类型 [完整性约束条件…],
  4.             [unique | fulltext | spatial] index | key
  5.             [索引名] (字段名[(长度)] [asc | desc])
  6. );
复制代码
(2)在已经存在的表上创建索引
  1. create [unique | fulltext | spatial] index 索引名
  2.             ON 表名 ( 字段名[(长度)] [asc | desc] );
复制代码
(3)利用alter table 语句来创建索引
  1. alter table 表名 add [unique | fulltext | spatial] index
  2.                     索引名 (字段名[(长度)] [asc | desc]);
复制代码
(4)示例1:建表时创建索引
  1. # 创建表的同时创建普通索引
  2. mysql> create table index1_tb( id int, name varchar(20), sex boolean, index(id));
  3. # 创建表的同时创建唯一索引
  4. mysql> create table index2_tb( id int unique, name varchar(20), unique index
  5. index2(id asc) );
  6. # 创建单列索引 (即普通的单列索引)
  7. mysql> create table index3_tb( id int, subject varchar(30), index
  8. index3(subject(10)) );
  9. # 创建多列索引 (即普通的多列索引)
  10. # 注意:使用多列索引时一定要特别注意,只有使用了索引中的第一个字段时才会触发索引。
  11. mysql> create table index4_tb( id int, name varchar(20), sex char(4), index
  12. index4(name,sex) );
复制代码
(5)示例2:键表后添加索引
  1. # 在创建完表后为其添加索引
  2. mysql> create unique index un_index on index1_tb(name);
  3. mysql> alter table index3_tb add primary key(id);
复制代码
7.查看索引

(1)格式
  1. # 查询索引
  2. show create table 表名 \G
  3. # 查询某张表中索引情况
  4. show index from table_name;
  5. # 使用计划查询SQL使用索引情况
  6. explain select * from 表名 where id=1 \G
  7. # 使用系统表查看所有索引
  8. select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名’;
  9. # 使用系统表查看单张表的所有索引
  10. select * from mysql.`innodb_index_stats` a where a.`database_name` = '数据库名' and
  11. a.table_name like '%表名%’;
复制代码
(2)示例
  1. mysql> show create table index1_tb \G
  2. mysql> show index from index3_tb;
  3. mysql> explain select * from index1_tb where id=1 \G
  4. # 注意possible_keys和key 这两个属性,possible_keys:MySQL在搜索数据记录时可以选用的各个索引,
  5. key:实际选用的索引
复制代码
8.删除索引

语法:
  1. drop index 索引名 on 表名
复制代码
注意:一些不再利用的索引会降低表的更新速度,影响数据库的性能,对于这样的索引,应该将其删除
9.索引原理

(1)概述
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的情势存储的磁盘上,这样的话,索引查找过程中就要产生磁盘I/O斲丧,相对于内存存取,I/O存取的斲丧要高几个数量级,以是评价一个数据布局作为索引的优劣最紧张的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的布局组织要尽量减少查找过程中磁盘I/O的存取次数。

(2)索引hash算法


(3)索引二叉树算法


(4)索引平衡二叉树算法
优点:

缺点:

(5)索引BTREE树算法
目前大部分数据库系统及文件系统都接纳B-Tree或其变种B+Tree作为索引布局,Btree布局可以有效的解决之前的相干算法遇到的题目。

注意:InnoDB引擎利用B+Tree,InnoDB的叶节点的data域存放的是数据,相比MyISAM效率要高一些, 但是比力占硬盘内存大小。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4