1. SQL 的 select 语句完整的执行顺序
1、from 子句组装来自不同数据源的数据,所以为表创建别名,别的地方可以用;2、where 子句基于指定的条件对记录行进行筛选;3、group by 子句将数据划分为多个分组;4、使用聚集函数进行计算; 一定要知道他的执行顺序在group by后having之前5、使用 having 子句筛选分组;6、计算所有的表达式;7、select 的字段;8、使用 order by 对结果集进行排序
2. SQL 之连接查询(左连接和右连接的区别)
外连接: 左连接(左外连接):以左表作为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。 右连接(右外连接):以右表作为基准进行查询,右表数据会全部显示出来,左表如果和右表匹配的数据则显示相应字段的数据,如果不匹配则显示为 null。 全连接:先以左表进行左外连接,再以右表进行右外连接。内连接: 显示表之间有连接匹配的所有行。
3、Mysql 性能优化?
1、当只要一行数据时使用 limit 1查询时如果已知会得到一条数据,这种情况下加上 limit 1 会增加性能。因为 mysql 数据库引擎会在找到一条结果停止搜索,而不是继续查询下一条是否符合标准直到所有记录查询完毕。2、选择正确的数据库引擎Mysql 中有两个引擎 MyISAM 和 InnoDB,每个引擎有利有弊。MyISAM 适用于一些大量查询的应用,但对于有大量写功能的应用不是很好。甚至你只需要update 一个字段整个表都会被锁起来。而别的进程就算是读操作也不行要等到当前 update 操作完成之后才能继续进行。另外,MyISAM 对于 select count(*)这类操作是超级快的。InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用会比 MyISAM 还慢,但是支持“行锁”,所以在写操作比较多的时候会比较优秀。并且,它支持很多的高级应用,例如:事物。3. 用 not exists 代替 not inNot exists 用到了连接能够发挥已经建立好的索引的作用,not in 不能使用索引。Not in 是最慢的方式要同每条记录比较,在数据量比较大的操作红不建议使用这种方式。4. 对操作符的优化,尽量不采用不利于索引的操作符。如:in not in is null is not null <> 等某个字段总要拿来搜索,为其建立索引:Mysql 中可以利用 alter table 语句来为表中的字段添加索引,语法为: alter table 表名 add index (字段名);5.分库分表,主从配置。6.对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。7、存储过程执行比一条一条地执行其中的各条语句快8、决不要检索比需求还要多的数据10、导入数据前应该关闭自动提交,最好删除索引然后导入完成后新建11、索引改善数据检索的性能,但是损害了数据插入删除更新的性能12、like很慢,一般来说最好使用fulltext而不是like13、如果从一个表中删除大量数据,应该使用optimize table回收所用的空间,从而优化表性能14、char比varchar效率高很多,因此确定字符长度字段最好使用char字段
4、Mysql 存储引擎有哪些?
(1)、InnoDB 存储引擎 InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB 是默认的 MySQL引擎。(2)、MyISAM 存储引擎 MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事物。(3)、MEMORY 存储引擎 MEMORY 存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。(4)、NDB 存储引擎 DB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC,但它是 Share Nothing 的架构,因此能提供更高级别的高可用性和可扩展性。NDB 的特点是数据全部放在内存中,因此通过主键查找非常快。关于 NDB,有一个问题需要注意,它的连接(join)操作是在 MySQL 数据库层完成,不是在存储引擎层完成,这意味着,复杂的 join 操作需要巨大的网络开销,查询速度会很慢。
5、Mysql常用的存储引擎 InnoDB 对比MyISAM
InnoDB支持事务和外键,有独立的缓冲池,支持表锁,不存储表的总行数,比MyISAM插入效率高
6、事务的四大特征是什么?
只要满足一下四个特征的就属于事务,事务的四大特性ACID(原子性、一致性、隔离性、持久性)(1)、原子性: 事务中整个操作要么全部完成,要么全部不完成。(2)、一致性: 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。(3)、隔离性: 事务间的操作互不干扰。(4)、持久性: 事务一旦完成,就永久保存。 mysql中关于事务的语句: start trunsaction --开启事务 savepoint 保留点 --创建保留点(即:还原点) rollback to 保留点 --回滚 commit --提交 补充: set autocommit=0 --设置mysql不自动提交更改 release 保留点 释放保留点
7、where在查询为空数据时不能使用==,应该书写成以下方式
select * from tablename where field is null
8、char类型支持的最大字节数是255,text约为64kb,MEDIUMTEXT约为16M,LONGTEXT约为4G
9、查询时exists适用于b表(在exists或者in中出现的)比A表大的情况,反之适用in10、默认情况下decimal为10位无小数的整数,在使用过程中DECIMAL(M,D) ,如果M>D,为M+2否则为D+211、SQL分类SQL全程为Structure Query Language(结构化查询语言)。SQL 语句主要可以划分为以下 3 个类别:1、DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、 数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter 等。2、DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、update 和 select 等。3、DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和 访问级别的语句。这些语句定义了数据库、表、字段、用户的访问
12、MySQL数据类型的选择和优化案例
1、手机号存储使用BIGINT代替CHAR或者VARCHAR存放手机号码。这是因为CHAR或者VARCHAR,占用空间大,影响查询性能。例如:11位手机号CHAR存储,utf8编码,则占用33个字节;使用如果使用INT的话,INT最大只能保存10为数据,而手机号为11位,会出现溢出,所以使用 BIGINT占用8个字节,支持11为数据存储。2、IP地址可以使用INT存储MySQL里提供了一个很好的函数:INET_ATON(),他负责把IP地址转化为数字,而另一个函数 INET_NTOA()负责将数字转化为IP地址,示例如下:注意:INT使用无符号,这是因为INT有符号最大为2147483647而无符号 最大为4294967295,如果使用有符号的话,会出现溢出,使用无符号则不会溢出。3、对于非负整数优先使用无符号整形存储4、避免使用enum类型,用TINYINT替代 修改值必须使用alter、排序的效率比较低、禁止使用数字作为enum枚举值5、使用timestamp(4字节)/datetime(8字节)存储日期时间 timestamp日期范围:1970-1-1 00:00:01----2038-01-10 03:14:07 timestamp以int存储,但可读性高6、尽可能把所有列定义为not null 索引null列会占用更多的空间 进行比较时需要作额外的处理
13、如何查看当前数据库的状态?
show status;
14、数据库报“Too many connections” 怎么办?
show full processlist;
15、如何查看索引是否有效?
在查询语句前加explain关键字,查看type类型是否为all,是则没有用到索引,否则使用了索引
16、group by使用规则
17、union/union all使用规则
18、视图的规则和限制
图片都来自《Mysql必知必会》
19、更新时使用update ignore 可以忽略更新错误的行,执行正确更新的数据。
20、一些零碎的知识点- 唯一索引和主键索引的区别:唯一索引可以为null
- 联接不是物理实体,在实际的数据库表中不存在,联结由mysql根据需要建立,它存在于查询的执行当中。
- and优先级高于or,多个or语句时,能够使用in替换的时候一定要使用in语句,执行效率更快
- mysql完全不区分大小写,使用binary建表的时候在字段后标识可以区分大小写,并且使用此函数也可以在查询时区分大小写
- 在查询时distinct关键字会应用于所有列而不是前置它的列