• 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也可以查看视图的相关信息

  • 相关阅读:
    SHELL[22]
    SHELL[15]
    SHELL[08]
    SHELL[12]
    SHELL[06]
    SHELL[24]
    SHELL[11]
    shell文件合并、去重
    SHELL[25]
    SHELL[14]
  • 原文地址:https://www.cnblogs.com/BigJunOba/p/9600377.html
Copyright © 2020-2023  润新知