MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、

时间:2023-03-09 16:13:59
MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、

  一、索引

  所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径。每种存储引擎(MyISAM、InnoDB、BDB、MEMORY等)对每个表至少支持16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。

  MyISAM和InnoDB存储引擎的表默认创建的都是BTREE索引。MEMORY存储引擎使用的是HASH索引,但也支持BTREE索引。

  MyISAM存储引擎的表,索引的前缀长度可以达到1000字节长,而对于InnoDB存储引擎的表,索引的前缀长度最长是767字节。

  1.索引的创建、修改和删除

  create INDEX index_name on table_name (index_col_name,...) 例如:create index cityname on city(city(10));

  drop INDEX index_name on table_name 例如:drop index cityname on city;

  2.索引设计的原则

  • 搜索的索引列,不一定是要选择的列。最适合索引的列是出现在where字句中的列,或连接字句中指定的列,而不是出现在SELECT关键字后的选择列表中的列。
  • 使用唯一索引。考虑某列中值的分布,索引的列的基数越大,索引的效果越好。
  • 使用短索引。如果对字符串列进行索引,应该指定一个前缀长度。
  • 利用最左前缀。在创建多个索引时,可以列用索引中最左边的列集来匹配行。这样的列集称为最左前缀。
  • 不要过度使用索引。每个额外的索引都要占用额外的磁盘时间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。
  • 对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存,如果有明确定义的主键,则按照主键顺序保存,如果没有主键,但是有唯一索引,那么就是按照唯一索引的顺序保存。如果既没有主键也没有唯一索引,那么表中会自动生成一个内部列,按照这个列的顺序保存。按照主键后者内部列进行的访问时最快的,因此InnoDB表尽量自己指定主键,当表中同时又几个列都是唯一的,都可以作为主键的时候,要选择最常作为访问条件的列作为主键,提高查询的效率。

  3.BTREE索引和HASH索引

  MEMORY表可以选择使用BTREE索引或者HASH索引。

  HASH索引的一些特征:(1)只用于使用=或<=>操作符的等式比较(2)优化器不能使用HASH索引来加速ORDER BY操作(3)MySQL不能确定在两个值之间大约有多少行,如果将一个MyISAM表改为HASH索引的MEMORY表,会影响一些查询的执行效率。(4)只能使用整个关键字来搜索一行。

  而对于BTREE索引,当使用>/</>=/<=/BETWEEN/!=/<>/LIKE操作符时,都可以使用相关列上的索引。

  使用 EXPLAIN SELECT * FROM city WHERE country_id > 1 \G  可以查看到是否使用到了某个索引key。

  

  二、视图

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

  视图的优势:

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的符合条件的结果集了。
  • 安全:使用视图的用户只能访问它们被允许查询的结果集,对普通表的权限管理并不能先知道某个行某个列,但是通过视图就可以简单实现。
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的形象,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

  视图有一些限制,在from关键字后面不能包含子查询,但是可以这么做,例如:先将从payment表中子查询的内容定义成一个视图payment_view,然后对payment_view

这个视图再创建一个视图payment_view1就可以实现子查询功能了。

  1.创建或修改视图

CREATE/ALTER [OR REPLACE]
VIEW view_name
AS select_statement
[WITH[CASCADED|LOCAL] CHECK OPTION with check option(默认CASCADED)
with local check optinon:只要满足本视图的条件就可以更新
with cascaded check option : 必须满足所有针对该视图的所有视图的条件才可以更新

  例如:

1.创建一个条件为amount < 10 的视图payment_view
create or replace view payment_view as select payment_id, amount from payment where amount < 10 with check option;
2.然后创建一个条件为amount > 5 并且带LOCAL选项的视图payment_view1
create or replace view payment_view1 as select payment_id, amount from payment_view where amount < 10 with local check option;
3.然后创建一个条件为amount > 5 并且带CASCADED选项的视图payment_view2
create or replace view payment_view2 as select payment_id, amount from payment_view where amount >5 with cascadedcheck option; 1.向payment_view1中执行更新操作
update payment_view1 set amount=10 where payment_id = 3;此时可以执行成功,因为只要满足payment_view1的条件amount > 5就可以了
2.向payment_view2中执行更新操作
update payment_view2 set amount=10 where payment_id = 3;此时不可以执行成功,因为必须同时满足payment_view2和payment_view的条件才可以更新

  2.删除视图:DROP VIEW [IF EXISTS] view_name [, view_name]...[RESTRICE|VASCADE]

  3.查看视图:

  (1)使用show tables命令可以显示视图的名称

  (2)使用show table status [from db_name] [like 'pattern']

  (3)使用show create view view_name 

  (4)通过系统表information_schema.views也可以查看视图的相关信息