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也可以查看视图的相关信息
MySQL开发篇(5)索引、视图、触发器、SQL中的安全问题、SQL Mode、的更多相关文章
- 在SQL中使用PL/SQL函数存在的问题
-----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...
- 15 SQL中的安全问题
SQL中的安全问题 1.SQL注入 demo1: SELECT * FROM user WHERE username = ? AND password ...
- PL/SQL中批量执行SQL脚本(不可把所有的语句都复制到New SQL Windows)
PL/SQL中批量执行SQL脚本,不可把所有的语句都复制到New SQL Window,因为这样会导致缓冲区过大而进程卡死! 最好的办法是将要执行的SQL脚本存放到指定文件中,如C:\insert.s ...
- PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别
PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...
- MySQL开发篇,存储引擎的选择真的很重要吗?
前言 谁说MySQL查询千万级别的数据很拉跨?我今天就要好好的和你拉拉家常,畅谈到深夜,一起过除夕!这篇文章也是年前的最后一篇,希望能带给大家些许收获,不知不觉查找文档和参考实体书籍就写了这么多,自己 ...
- MySQL开发篇(未完待续)
一.索引 什么是索引? 索引是帮助Mysql提高获取数据的数据结构,换一句话讲就是"排好序的快速查找的数据结构". 1.索引的分类 MySQL主要的几种索引类型:1.普通索引.2. ...
- MySQL数据库篇之索引原理与慢查询优化之一
主要内容: 一.索引的介绍 二.索引的原理 三.索引的数据结构 四.聚集索引与辅助索引 五.MySQL索引管理 六.测试索引 七.正确使用索引 八.联合索引与覆盖索引 九.查询优化神器--explai ...
- MySQL数据库篇之索引原理与慢查询优化之二
接上篇 7️⃣ 正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...
- mysql 开发基础系列16 视图
一. 什么是视图视图是一种虚拟存在的表,行和列数据来自,定义视图的查询中使用的表,并且是在使用视图时动态生成的.优势有: 简单: 使用视图的用户完全不需要关心后面对应的表的结构,关联条件,筛选条件. ...
随机推荐
- Android Studio [真机测试/开发者模式]
一.手机设置 首先根据自己的手机型号百度打开开发者模式, 我的是vivo,设置--->更多设置-->关于手机-->软件版本号连续点击会提示开启开发者模式. 并在开发者选项里打开USB ...
- selenium-01-简介
一.Selenium是什么? Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,本系列现在主要包括以下4款: 1.Selenium Core:支持DHTML的测试案 ...
- Dubbo源码解析(一)服务发现
一.Dubbo源码模块 官网地址 源码地址 1.1 源码模块组织 Dubbo工程是一个Maven多Module的项目,以包结构来组织各个模块. 核心模块及其关系,如图所示: 1.2 模块说明 dubb ...
- uni-app实现滑动切换效果
在对于uni-app框架了解之后,今天就实现一个滚动切换tab效果,这个很常见的一个效果,最后封装成一个组件,便于以后使用,写这个需要引入uni官方提供的uni.css样式,用到了写好的样式,就不需要 ...
- druid 连接池的配置参数
介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生 ...
- Linux 远程登录命令telnet
一.telnet简介: telnet命令通常用来远程登录.telnet程序是基于TELNET协议的远程登录客户端程序.Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准 ...
- Android开发——Toolbar常用设置
本篇笔记用来记录常用的Toolbar设置,如Toolbar颜色设置,显示返回按钮,显示右边三个点按钮 之前Android 使用的ActionBar,Android5.0开始,谷歌官方推荐使用Toolb ...
- Kafka常用命令合集
在上一篇文章<Linux安装Kafka>中,已经介绍了如何在Linux安装Kafka,以及Kafka的启动/关闭和创建发话题并产生消息和消费消息.这篇文章就介绍介绍Kafka的那些常用的命 ...
- linux分析利刃之sar命令详解
一.sar的概述 在我使用的众多linux分析工具中,sar是一个非常全面的一个分析工具,可以比较瑞士军刀,对文件的读写,系统调用的使用情况,磁盘IO,CPU相关使用情况,内存使用情况,进程活动等都可 ...
- mysql操作遇到的坑(第二版)
1.通过条件查询出上一条与下一条 sql说明:本表关联本表,然后通过其中一个表,查询出对应的条件,再用另外一个表求出上一条与下一条的数据,求出来的数据是多条的 SELECT ua.id, ua.wx_ ...