一、索引

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

MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、的更多相关文章

  1. 在SQL中使用PL/SQL函数存在的问题

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  2. 15 SQL中的安全问题

    SQL中的安全问题     1.SQL注入         demo1:             SELECT * FROM user WHERE username = ? AND password ...

  3. PL/SQL中批量执行SQL脚本(不可把所有的语句都复制到New SQL Windows)

    PL/SQL中批量执行SQL脚本,不可把所有的语句都复制到New SQL Window,因为这样会导致缓冲区过大而进程卡死! 最好的办法是将要执行的SQL脚本存放到指定文件中,如C:\insert.s ...

  4. PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别

    PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...

  5. MySQL开发篇,存储引擎的选择真的很重要吗?

    前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己 ...

  6. MySQL开发篇(未完待续)

    一.索引 什么是索引? 索引是帮助Mysql提高获取数据的数据结构,换一句话讲就是"排好序的快速查找的数据结构". 1.索引的分类 MySQL主要的几种索引类型:1.普通索引.2. ...

  7. MySQL数据库篇之索引原理与慢查询优化之一

    主要内容: 一.索引的介绍 二.索引的原理 三.索引的数据结构 四.聚集索引与辅助索引 五.MySQL索引管理 六.测试索引 七.正确使用索引 八.联合索引与覆盖索引 九.查询优化神器--explai ...

  8. MySQL数据库篇之索引原理与慢查询优化之二

    接上篇 7️⃣  正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...

  9. mysql 开发基础系列16 视图

    一. 什么是视图视图是一种虚拟存在的表,行和列数据来自,定义视图的查询中使用的表,并且是在使用视图时动态生成的.优势有: 简单: 使用视图的用户完全不需要关心后面对应的表的结构,关联条件,筛选条件. ...

随机推荐

  1. CocosCreator实现动物同化

    获取源码 关注微信公众号『一枚小工 』,发送『动物同化 』获取完整游戏源码. 游戏玩法 游戏目标是将游戏区域的动物全部同化成同一种动物.游戏从左上角开始,从右边点击需要变成的目标动物头像,如果被同化动 ...

  2. SpringBootSecurity学习(04)网页版登录其它授权和登录处理

    其它授权配置 security的配置类中,对所有路径进行了统一授权配置.但是有的内容我们也需要让未登录游客有权限访问,比如js,css等静态文件,还有一些宣传页面等等.这些路径可以单独配置: 我们来试 ...

  3. 浅谈JavaScript的闭包原理

    在一般的教程里,都谈到子作用域可以访问到父级作用域,进而访问到父级作用域中的变量,具体是如何实现的,就不得不提及到函数堆栈和执行上下文. 举个例子,一个简单的闭包:   首先,我们可以知道,examp ...

  4. springboot + mybatis + mycat整合

    1.mycat服务 搭建mycat服务并启动,windows安装参照. 系列文章: [Mycat 简介] [Mycat 配置文件server.xml] [Mycat 配置文件schema.xml] [ ...

  5. mysql数据库安全性配置——日志记录

    一:开启数据库日志记录 (1)在查看数据库是否开启日志记录,默认是OFF,即关闭状态.(可在数据库中执行该查询语句,也可在服务器端执行) show variables like 'log_bin'; ...

  6. java通过代理创建Conncection对象与自定义JDBC连接池

    最近学习了一下代理发现,代理其实一个蛮有用的,主要是用在动态的实现接口中的某一个方法而不去继承这个接口所用的一种技巧,首先是自定义的一个连接池 代码如下 import java.lang.reflec ...

  7. 06-border

    边框 border:边框,描述盒子的边框 边框的三要素:粗细 线性样式 颜色 例如:border:1px solid red: 如果颜色不写,默认是黑色:如果粗细不写,不显示边框:如果只写线性样式,默 ...

  8. jQuery常用方法(一)-基础

    $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test.jpg", ...

  9. .net core 3.0 Signalr - 实现一个业务推送系统

    ## 介绍 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适 ...

  10. .Net Core自动化部署系列(三):使用GitLab CI/CD 自动部署Api到Docker

    之前写过使用Jenkins实现自动化部署,最近正好没事研究了下GitLab的自动化部署,顺便记录一下. 使用GitLab部署我们需要准备两件事,第一个起码你得有个GitLab,自己搭建或者使用官方的都 ...