一、索引

  所有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. Save&Load--Unity存档读档的学习总结

    存档与读档功能 举例: 传统RPG游戏(仙剑.空之轨迹): 1.角色信息(生命值,等级) 2.道具信息(装备,药品) 3.场景信息(场景名称.角色坐标) 4.事件信息(任务相关) 关卡类游戏:关卡的通 ...

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

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

  3. java实现有道翻译爬虫

    我的博文地址 https://www.cnblogs.com/lingdurebing/p/11618902.html 使用的库 1.commons-codec 主要是为了加密,可以直接用java原生 ...

  4. Object.keys方法详解

    一.官方解释 Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 .如果对象的键-值都不 ...

  5. mybatis入门百分百

    今天重新返回来看自己的mybatis,总结了一些更好入门的办法,下面用最简单的方法带领大家入门. 此处先引入类包的关系图片 1.构建一个==普通==maven项目 构建好之后向pom.xml添加一下依 ...

  6. Sublime text3 配置c++环境 并设置快捷键

    VScode配c++环境太麻烦了 打算用sublime写C++ 记录一下配置过程因为我是有DEV环境的 直接将MINGW64加入环境变量即可 在DEV文件夹下的MinGW64\bin(就是有g++.e ...

  7. 【JavaScript】 控制自适应高度

    <iframe src="需要连接的iframe地址" id="iframepage" name="iframepage" frame ...

  8. 基于 H5 WebGL 的 3D 室内定位及电子围栏

    前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...

  9. 06-01 DeepLearning-图像识别

    目录 深度学习-图像识别 一.人脸定位 二.手工提取特征的图像分类 2.1 识图认物 2.2 传统分类系统的特征提取 2.3 计算机眼中的图像 2.4 什么是图像特征? 2.5 卷积运算 2.6 利用 ...

  10. C-01 手写数字识别

    目录 手写数字识别应用程序 一.导入模块 二.图像转向量 三.训练并测试模型 四.模型转应用程序 4.1 展示图片 4.2 处理图片 4.3 预测图片 更新.更全的<机器学习>的更新网站, ...