like
:%
匹配任意字符(含0个)_
匹配单个字符between and
:闭区间in (value1, value2, ...)
:判断是否位于列表order by field1 field2 asc|desc
能够每一列都按照不一样的升序/降序进行排列,默认为升序。除了字段以外,还可使用表达式、函数、别名进行排序。order by 通常放在最后,除了 limit 以外。group by expression
。
select 分组函数,fields from tablename [where] group by 分组列表[having][order by]
select 查询列表 from t1 [链接类型] join t2 on 链接条件
inner join
left [outer] join
,左边的为主表right [outer] join
,右边为主表full [outer] join
cross join
select
语句,称为子查询或内查询。
limit [offset] size
,offset 表示起始索引,从0开始,默认为0,size 表示个数insert into table (field1,...) values(value1,...)
支持插入多行insert into table set field1=value1 , field2=value2,...
只能插入一行update table set filed=value,... where...
delete from table where...
删除一或多行truncate table tablename
整体来讲,查询语法以下:mysql
SELECT DISTINCT select_list
FROM left_table join_type
JOIN right_table
ON join_condition
WHERE where_condition
GROUP BY group_by_list
HAVING having_condition
ORDER BY order_by_condition
LIMIT offset size
复制代码
外键:算法
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单位。sql
其中,一致性保证了事务的执行结果是正确的。在无并发状况下,原子性保证了一致性。在并发状况下,原子性和隔离性保证了一致性。持久性用来应对数据库崩溃。数据库
隐式事务:mysql 默认开启了 autocommit 选项,会隐式提交事务。express
显式事务:缓存
set autocommit = 0;
start transaction;
该语句可选。commit;
提交 rollback;
回滚第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。安全
第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的状况),也即全部非关键字段都彻底依赖于任意一组候选关键字。bash
第三范式(3NF):在第二范式的基础上,数据表中若是不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。所以,知足第三范式的数据库表应该不存在以下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y服务器
视图是一种虚拟的表,能够和普通表同样使用,行和列的数据来自定义视图的查询中使用的表,在使用视图的时候动态生成,只保存 sql 逻辑,不保存查询结果。能够应用于多个地方用到一样的查询结果的情景。数据结构
优势:
建立视图: create view 视图名 as 查询语句
修改视图: create or replace view 视图名 as 查询语句
或者 alter view 视图名 as 查询语句
删除视图:drop view 视图名
查看视图:desc 视图名
和show create view 视图名
索引是一种特殊的文件,包含对数据表里全部记录的引用指针。
MySQL 官方定义:索引是帮助 MySQL 高效获取数据的数据结构。在数据自己以外,数据库还维护着一个知足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这种数据结构就是索引。索引能够理解为已排序的快速查找数据结构。平时所说的索引,若是没有特别指明,都是指的是 B+ 树。
通常来讲索引自己也很大,不可能所有存储在内存中,所以索引每每以索引文件的形式存储在磁盘上。
优势:
缺点:
Mysql基本存储结构是页,各个数据页组成双向链表,每一个数据页中的记录又能够组成一个单向链表。查找时,先遍历双向链表,定位到所在的页。每一个数据页都会为所存储的记录生成页目录,经过主键查找会在页目录使用二分法定位到对应的槽,从槽中遍历找到指定记录。非主键搜索,会依次遍历单链表中的每条记录。
SQL 执行顺序:
SELECT DISTINCT select_list
FROM left_table join_type
JOIN right_table
ON join_condition
WHERE where_condition
GROUP BY group_by_list
HAVING having_condition
ORDER BY order_by_condition
LIMIT offset size
复制代码
mysql 处理的顺序:
FROM left_table
ON join_condition
join_type JOIN right_table
WHERE where_condition
GROUP BY group_by_list
HAVING having_condition
SELECT
DISTINCT select_list
ORDER BY order_by_condition
LIMIT offset size
复制代码
CREATE [UNIQUE] INDEX indexName ON table(columnlist);
或者 ALTER table ADD [UNIQUE] INDEX [indexname] ON (columnlist)
DROP INDEX [indexname] on table
SHOW INDEX FROM table
B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具备 B Tree 的平衡性,而且经过顺序访问指针来提升区间查询的性能。
当没有索引时,咱们须要遍历双向链表来定位所在的页,如今经过索引,能够很快定位到所在的页上。底层采用B+树实现。B+树是平衡树的一种,若是对这棵树进行增删改,须要从新维持平衡,有额外的开销。
采用hash算法,把键值换成hash值,只须要一次hash算法就能够当即定位,速度快。
局限:
MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,则取出其 data 域的值,而后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
InnoDB: 其数据文件自己就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件自己就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,所以InnoDB表数据文件自己就是主索引。这被称为“聚簇索引(或汇集索引)”。而其他的索引都做为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不一样的地方。在根据主索引搜索时,直接找到key所在的节点便可取出数据;在根据辅助索引查找时,则须要先取出主键的值,再走一遍主索引。 所以,在设计表的时候,不建议使用过长的字段做为主键,也不建议使用非单调的字段做为主键,这样会形成主索引频繁分裂。
左链接 left join 中,左表全都有,left join 用于肯定如何从右表搜索行,则右表创建索引,效率更好。右链接同理。
like %xxx
和like %xxx%
没法使用索引,只有通配符卸载最右才能使用索引。当使用like %xx%
时,可使用覆盖索引,会使用到索引,可是类型为 range建议:
Explain 关键字用来模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理 SQL 语句的,从而分析查询语句或者表结构的性能瓶颈。
使用 explain + sql 语句能够查看对应的 SQL 语句的执行计划。
InnoDB的行级锁是基于索引实现的,若是查询语句未命中任何索引,那么InnoDB会使用表级锁。不一样于MyISAM老是一次性得到所需的所有锁,InnoDB的锁是逐步得到的,当两个事务都须要得到对方持有的锁,致使双方都在等待,这就产生了死锁。 咱们能够采起如下方式避免死锁:
MyISAM采用表级锁(table-level locking)。 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁。
开启查询缓存后在一样的查询条件以及数据状况下,会直接在缓存中返回结果。这里的查询条件包括查询自己、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。所以任何两个查询在任何字符上的不一样都会致使缓存不命中。
缓存创建以后,Mysql的查询缓存系统会跟踪查询中涉及的每张表,若是这些表(数据或结构)发生变化,那么和这张表相关的全部缓存数据都将失效。
缓存虽然可以提高数据库的查询性能,可是缓存同时也带来了额外的开销,每次查询后都要作一次缓存操做,失效后还要销毁。 所以,开启缓存查询要谨慎,尤为对于写密集的应用来讲更是如此。若是开启,要注意合理控制缓存空间大小。
InnoDB的最大特点就是支持了ACID兼容的事务(Transaction)功能。
是 MySQL 默认的事务型存储引擎,只有在须要它不支持的特性时,才考虑使用其它存储引擎。
实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,经过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻影读。
特色:
如今大多数时候咱们使用的都是InnoDB存储引擎,可是在某些状况下使用MyISAM更好,好比:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库作主从分离的状况下,常常选择MyISAM做为主库的存储引擎。
使用show engines
查询引擎。
对比项 | MyISAM | InnoDB |
---|---|---|
主键和外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
锁 | 表锁 | 行锁,适合高并发操做 |
缓存 | 只缓存索引,不缓存真实数据 | 缓存索引以及真实数据,对内存要求较高 |
表空间 | 小 | 大 |
小的数据集驱动大的数据集
select * from A where id in(select id from B)
等价于:
for select id from B
for select * from A where A.id = B.id
复制代码
当 B 表的数据集必须小于 A 表的数据集时,用 in 优于 exists。
select * from A where exists (select * from B where B.id = A.id)
等价于:
for select * from A
for select * from B where B.id=A.id
复制代码
当 A 表的数据集小于 B 表的数据集时,用 exists 优于 in。
select ... from table where exists (subquery)
复制代码
该语法的理解为:将主查询的数据,放到子查询作条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
MySQL 支持两种方式的排序, FileSort 和 Index。其中 Index 效率更高,使用 MySQL 扫描索引自己完成排序。
ORDER BY 知足两种状况时,会使用 Index 方式进行排序。 :
所以,要尽量在索引列上完成排序操做,遵守索引的最佳左前缀原则。
若是 ORDER BY 不在索引列上, filesort 有两种算法:MySQL 启动双路排序和单路排序。
因为单路排序要取出全部数据,可能致使每次只能取 buffer 大小的数据,从而须要屡次 IO 操做。
提升 order by 的速度:
sort_buffer_size
max_length_for_sort_data
group by 实质是先排序后分组,遵守索引创建的最佳左前缀。
当没法使用索引列时,尝试增大sort_buffer_size
和max_length_for_sort_data
。
where 高于 having,能写在 where 限定的条件就不要去 having 限定了。
水平切分
又称为 Sharding,将同一个表中的记录拆分到多个结构相同的表中,将数据分布到集群的不一样节点上,缓解单个数据库的压力。
通常水平查分根据表中的某一字段(通常是主键)取模,将一张表的数据拆分到多个表。采用 hash(key)%N 的方法。使用单独一个数据库来存储映射关系。
分片的选择时取决于最频繁的查询SQL的条件,若是某个表的数据有明显的时间特征,则一般适合使用时间范围分片。
能够将原来的链接分解为多个单表查询,而后在用户程序中进行链接。
优势:
缺点:
不少大表对MySQL这种关系型数据库的需求并不大,并不要求ACID,能够考虑将这些表歉意到NoSQL,解决水平扩展问题。如日志类、监控类、统计类数据,非结构化或若结构化数据,对事务要求不强的数据等。
垂直切分
将一张表按列切分红多个表,将数据库中标的密集程度部署到不一样的库中。如电商数据库切分红商品数据库和用户数据库。当一张表的字段过多时考虑垂直拆分,一般将一张表的字段拆分为主表和扩展表。
主从复制是用来创建一个和主数据库彻底同样的数据库环境,称为从数据库。主数据库通常是准实时的业务数据库。
好处:
原理:
基本原理是让主数据库处理增删改操做,从数据库处理查询操做。数据库复制被用来把事务性操做致使的变动同步到集群中的从数据库。
大多数业务每每读多写少,这时候数据库的读性能就会成为性能瓶颈。
为了解决读的性能瓶颈,有多种解决方案。