Mysql数据库 深度知识点
mysql登录命令
mysql语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用英文分号结尾
- 每条命令根据需要,可以进行缩进或换行
- 注释
- 单行注释:#注释文字
- 单行注释:-- 注释文字 ,注意, 这里需要加空格
- 多行注释:/ **注释文字 **/
SQL的语言分类
- DQL(Data Query Language):数据查询语言select 相关语句
- DML(Data Manipulate Language):数据操作语言insert 、update、delete 语句
- DDL(Data Define Languge):数据定义语言create、drop、alter 语句
- TCL(Transaction Control Language):事务控制语言set autocommit=0、start transaction、savepoint、commit、rollback
类型(n)说明
- 无论N等于多少,int永远占4个字节
- N表示的是显示宽度,不足的用0补足,超过的无视长度而直接显示整个数字,但这要整型设置了unsigned zerofill才有效
就是5以下舍弃5以上进位,如果需要处理数字为5的时候,需要看5后面是否还有不为0的任何数字,如果有,则直接进位,如果没有,需要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉
数据类型选择的一些建议
- 选小不选大:一般情况下选择可以正确存储数据的最小数据类型,越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。
- 简单就好:简单的数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价要小得多,因为字符集和校对规则(排序规则)使字符比整型比较更加复杂。
- 尽量避免NULL:尽量制定列为NOT NULL,除非真的需要NULL类型的值,有NULL的列值会使得索引、索引统计和值比较更加复杂。
- 浮点类型的建议统一选择decimal
- 记录时间的建议使用int或者bigint类型,将时间转换为时间戳格式,如将时间转换为秒、毫秒,进行存储,方便走索引
权限生效时间
创建用户
说明:
主机名默认值为%,表示这个用户可以从任何主机连接mysql服务器 密码可以省略,表示无密码登录
- priveleges (权限列表),可以是all,表示所有权限,也可以是select、update等权限,多个权限之间用逗号分开。
- ON 用来指定权限针对哪些库和表,格式为数据库.表名 ,点号前面用来指定数据库名,点号后面用来指定表名,*.* 表示所有数据库所有表。
- TO 表示将权限赋予某个用户, 格式为username@host,@前面为用户名,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。
- WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
查看用户有哪些权限
授权原则说明
- 只授予能满足需要的最小权限,防止用户干坏事,比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限
- 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段
- 初始化数据库的时候删除没有密码的用户,安装完数据库的时候会自动创建一些用户,这些用户默认没有密码
- 为每个用户设置满足密码复杂度的密码
- 定期清理不需要的用户,回收权限或者删除用户
总结
- 通过命令的方式操作用户和权限不需要刷新,下次登录自动生效
- 通过操作mysql库中表的方式修改、用户信息,需要调用flush privileges;刷新一下,下次登录自动生效
- mysql识别用户身份的方式是:用户名+主机
- 本文中讲到的一些指令中带主机的,主机都可以省略,默认值为%,表示所有机器
- mysql中用户和权限的信息在库名为mysql的库中
修改列
delete单表删除
注意:如果无别名的时候,表名就是别名如果有别名,delete后面必须写别名如果没有别名,delete后面的别名可以省略不写。
示例
多表删除
可以同时删除多个表中的记录,语法如下:
说明:别名可以省略不写,但是需要在delete后面跟上表名,多个表名之间用逗号隔开。
示例1
删除test1表中的记录,条件是这些记录的字段a在test.c2中存在的记录
drop,truncate,delete区别
- drop (删除表):删除内容和定义,释放空间,简单来说就是把整个表去掉,以后要新增数据是不可能的,除非新增一个表。drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index),依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。如果要删除表定义及其数据,请使用 drop table 语句。
- truncate (清空表中的数据):删除内容、释放空间但不删除定义(保留表的数据结构),与drop不同的是,只是清空表数据而已。注意:truncate不能删除具体行数据,要删就要把整个表清空了。
- delete (删除表中的数据):delete 语句用于删除表中的行。delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存,以便进行进行回滚操作。truncate与不带where的delete :只删除数据,而不删除表的结构(定义)truncate table 删除表中的所有行,但表结构及其列、约束、索引等保持不变。对于由foreign key约束引用的表,不能使用truncate table ,而应使用不带where子句的delete语句。由于truncate table 记录在日志中,所以它不能激活触发器。delete语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效;如果有相应的 trigger,执行的时候将被触发。truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。如果有自增列,truncate方式删除之后,自增列的值会被初始化,delete方式要分情况(如果数据库被重启了,自增列值也会被初始化,数据库未被重启,则不变)
- 如果要删除表定义及其数据,请使用 drop table 语句
- 安全性:小心使用 drop 和 truncate,尤其没有备份的时候,否则哭都来不及
- 删除速度,一般来说: drop> truncate > delete
drop
|
truncate
|
delete
|
|
条件删除
|
不支持
|
不支持
|
支持
|
删除表结构
|
支持
|
不支持
|
不支持
|
事务的方式删除
|
不支持
|
不支持
|
支持
|
触发触发器
|
否
|
否
|
是
|
like(模糊查询)
pattern中可以包含通配符,有以下通配符:%:表示匹配任意一个或多个字符_:表示匹配任意一个字符。
<=>(安全等于)
总结
- like中的%可以匹配一个到多个任意的字符,_可以匹配任意一个字符
- 空值查询需要使用IS NULL或者IS NOT NULL,其他查询运算符对NULL值无效
- 建议创建表的时候,尽量设置表的字段不能为空,给字段设置一个默认值
- <=>(安全等于)玩玩可以,建议少使用
说明:offset:表示偏移量,通俗点讲就是跳过多少行,offset可以省略,默认为0,表示跳过0行;范围:[0,+∞)。count:跳过offset行之后开始取数据,取count行记录;范围:[0,+∞)。limit中offset和count的值不能用表达式。
limit中不能使用表达式,limit后面的2个数字不能为负数
上面java代码中两个表的连接查询使用了嵌套循环,外循环每执行一次,内循环的表都会全部遍历一次,如果放到mysql中,就相当于内标全部扫描了一次(一次全表io读取操作),主表(外循环)如果有n条数据,那么从表就需要全表扫描n次,表的数据是存储在磁盘中,每次全表扫描都需要做io操作,io操作是最耗时间的,如果mysql按照上面的java方式实现,那效率肯定很低。
msql内部使用了一个内存缓存空间,就叫他join_buffer吧,先把外循环的数据放到join_buffer中,然后对从表进行遍历,从表中取一条数据和join_buffer的数据进行比较,然后从表中再取第2条和join_buffer数据进行比较,直到从表遍历完成,使用这方方式来减少从表的io扫描次数,当join_buffer足够大的时候,大到可以存放主表所有数据,那么从表只需要全表扫描一次(即只需要一次全表io读取操作)。mysql中这种方式叫做Block Nested Loop。字段值为NULL的时候,not in查询有大坑,这个要注意建议创建表的时候,列不允许为空
delimiter关键字 sql语句结束符
总结一下使用索引的一些建议
- 在区分度高的字段上面建立索引可以有效的使用索引,区分度太低,无法有效的利用索引,可能需要扫描所有数据页,此时和不使用索引差不多
- 联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整
- 查询记录的时候,少使用*,尽量去利用索引覆盖,可以减少回表操作,提升效率
- 有些查询可以采用联合索引,进而使用到索引下推(IPC),也可以减少回表操作,提升效率
- 禁止对索引字段使用函数、运算符操作,会使索引失效
- 字符串字段和数字比较的时候会使索引无效
- 模糊查询'%值%'会使索引无效,变为全表扫描,但是'值%'这种可以有效利用索引
- 排序中尽量使用到索引字段,这样可以减少排序,提升查询效率
Mysql数据库 深度知识点的更多相关文章
- Mysql数据库重要知识点(知了堂学习心得)
Mysql数据库知识点 1.管理数据库语句: 使用数据库: use test; 添加数据库: create database 数据库名; create database test; 修改数据库: al ...
- MySQL数据库----------小知识点
**********************补2016年5月23日的博客************************* MySQL数据库 常用数据类型: int 整数 ...
- 【Mysql数据库】知识点总结
本文转载自:http://www.cnblogs.com/tonghun/p/7191131.html 一 数据库常用操作 mysql -u+username -p+password:登陆数据库管理系 ...
- 粗结MySql数据库基础知识点之一
首先弄什么是数据库? 数据库就是用来存储和管理数据的仓库. 数据库存储数据的优点: 1.可存储大量的数据 2.方便检索 3.保持数据的一致性,完整性 4.安全 可共享 5.通过组合分析,可以产 ...
- 【JAVA】mysql数据库常见知识点
目录 1.事务四大特性 2.数据库隔离等级 3.Mysql两种存储引擎的区别 4.哈希索引和B+树索引 5.聚簇索引和非聚簇索引 6.索引的优缺点,什么时候使用索引,什么时候不能使用索引 7.索引的底 ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- MySQL数据库开发规范知识点
前言: 设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一. 约定优先于配置(Convention Over Configuration ...
- 知识点:Mysql 数据库索引优化实战(4)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 一:插入订单 业务逻辑:插 ...
- linux django 知识点 安装mysql数据库 和 pycharm
django 命令及相关知识点 1. 启动 pycharm 命令:sh pycharm.sh 2. 创建 django 项目 : django-admin.py startproject Hello ...
随机推荐
- python27期尚哥讲并发编程:
python27day23并发编程----------------------------------------------------------------------------------- ...
- CPU-bound(计算密集型) 和I/O bound(I/O密集型)/数据密集型
https://blog.csdn.net/q_l_s/article/details/51538039 I/O密集型 (CPU-bound)I/O bound 指的是系统的CPU效能相对硬盘/内存的 ...
- .Net反射-两种方式获取Enum中的值
public enum EJobType { 客服 = , 业务员 = , 财务 = , 经理 = } Type jobType = typeof(EJobType); 方式1: Array enum ...
- MyEclipse10破解 运行run.bat闪退 亲自试验
找到MyEclipse安装的自带的jdk(方法是打开MyEclipse,依次window->Preferences->Java->Installed JRES找到默认路径,我的是:自 ...
- 11/4 <LinkedList>
82. Remove Duplicates from Sorted List II 跳过重复节点,返回head. class Solution { public ListNode deleteDupl ...
- CF888G XOR-MST 最小异或生成树
CF888G XOR-MST 链接 CF888G 思路 trie上贪心,先左右两边连边,再用一条边的代价连起左右两颗树.因为内部的边一定比跨两棵树的边权笑,显然是对的. 代码自己瞎yy的.启发式合并 ...
- MySQL实战45讲学习笔记:第六讲
一.今日内容概要 今天我要跟你聊聊 MySQL 的锁.数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则.而锁就是用来实现这些访问规则的重 ...
- 第09组 Beta冲刺(5/5)
队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 无 接下来的计划 无 还剩下哪些任务 s 答辩 遇到 ...
- 工作中常用的Linux命令介绍与实践
前言 做后端开发的同学,一般都会接触到服务器,而我们现在的系统用的比较多的服务器系统就是linux了,平时多多少少也会接触到一些linux下的shell命令.我们来介绍下linux一些常用的命令和使用 ...
- 第23课 优先选用make系列函数
一. make系列函数 (一)三个make函数 1. std::make_shared:用于创建shared_ptr.GCC编译器中,其内部是通过调用std::allocate_shared来实现的. ...