我是靠谱客的博主 闪闪小蘑菇,最近开发中收集的这篇文章主要介绍Mysql,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. SQL 的select语句完整的执行顺序:

	1. from  子句组装来自不同数据源的数据;    				FROM <left_table>
	2. where 子句给予制定的条件对记录行进行筛选;  			<jion_type> JOIN <right_table>
	3. group by 子句将数据划分为多个分组;  				ON  <join_condition>
	4. 使用聚集函数进行计算;  							WHERE <where_condition>
	5. 使用having子句筛选分组; 							GROUP BY <gorup_by_list>
	6. 计算所有的表达式 ;    								WITH {CUBE| ROLLUP}
	7. select 的字段										SELECT   DISTINCT
	8. 使用order by 对结果集进行排序;						ORDER BY <order_by_list>

2. Mysql数据库存储的原理

	存储过程是一个可编程的函数,它在数据库中创建并保存。他可以有SQL语句和一些特殊的控制结构组成。
	当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。
	数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。
	存储过程通常有以下优点:
	1. 存储过程能实现较快的执行速度
	2. 存储过程允许标准组件是编程
	3. 存储过程可以用流程控制语句编写,有很强的的灵活性,可以完成复杂的判断和较复杂的运算。
	4. 存储过程可被作为一种安全机制来充分利用。
	5. 存储过程能够减少网络流量。

3. 事物的特性

	1. 原子性(Atomicity): 事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
	2. 一致性(Consistency): 几个并行执行的数据,其执行结果必须与按某一顺序串行执行的结果相一致。
	3. 隔离性(Isolation): 事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
	4. 持久性(Durability): 对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

4. 数据库索引

	数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。索引的实现通常使用B_TREE。B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,他从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。

5. 数据库怎么优化查询效率?

  1. 存储引擎选择:如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用存储引擎MyISAM是比较明智的。
  2. 分表分库,主从。
  3. 对查询进行优化,要尽量避免全表扫描,首先应考虑在where 及 order by涉及的列上建立索引。
  4. 应尽量避免在where 子句中对使用 != 或 <>  操作符,否则将引擎放弃使用索引而进行全表扫描。
  5. 应尽量避免在where子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  6. 应尽量避免在where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
  7. Update 语句,如果只更改1 ,2 个字段,不要Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志。
  8. 对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。

6. MySQL集群的优缺点?

  优点:
  1. 99.999%的高可用
  2. 快速的自动失效切换
  3. 灵活的分布式体系结构,没有单点故障
  4. 高吞吐量和低延迟
  5. 可扩展性强, 支持在线扩容。
  缺点:
  6. 存在很多限制, 比如: 不支持外键
  7. 部署,管理,配置很复杂
  8. 占用磁盘空间大,内存大
  9. 备份和恢复不方便
  10.重启的时候,数据节点将load到内存需要很长的时间

7. 你用的MYSQL的那个引擎,个引擎之间有什么区别

  主要 MYISAM 与 InnoDB两个引擎,其主要区别如下:
  1. InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要那个出错还可以回滚还原,而 MyISAM 就不可以了。
  2. MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;
  3. InnoDB支持外键,MyISAM不支持;
  4. InnoDB中不保存表的行数,如 select count() from table 时,InnoDB;需要扫描一遍整个表来计算多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count() 语句包含where条件时,MyISAM也需要扫描整个表。
  5. 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引,清空整个表时,InnoDB 是 一行一行的删除,效率非常慢。MyISAM 则会重建表;
  6. InnoDB 支持行锁

8. 数据库的优化?

1. 优化索引,SQL语句,分析慢查询
2. 设计表的时候严格根据数据库的涉及范式来设计数据库;
3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO
4. 优化硬件;采用SSD,使用磁盘队列技术等
5. 采用MYSQL内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O。
7. 主从分离读写;采用主从复制数据库的读操作和写入操作分离开来;
8. 分库分表分机器,主要的原理就是数据路由。
9. 选择合适的表引擎,参数上的优化。
10. 进行架构级别的缓存,静态化和分布式
11.  不采用全文索引
12. 采用更快的存储方式。

9. MySQL数据库如何分区,分表?

  分表可以通过三种方式:MySQL集群,自定义规则和merge存储引擎
  分区有四类:
  RANGE 分区: 基于属于一个给定连续区间的列值,把多行分配给分区。
  LIST 分区:类似于按RANGE 分区,区别在于LIST分区 是基于列值匹配一个离散值集合中的某个值来进		行选择。
  HASH 分区: 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MYSQL中有效的,产生非负整数值得任何表达式。
  KEY 分区: 类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数。

10. 如何对查询命令进行优化?

  1. 应尽量避免全表扫描,首先应考虑在where及order by 涉及的列上建立索引。
  2. 应尽量避免在where 子句中对字段进行 null 值判断,避免使用 != 或 <> 操作符,避免使用or连接条件,或在where子句中使用参数,对字段进行表达式或函数操作,否则会导致全表扫描。
  3. 不要在where子句中的 "=" 左边进行函数,算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
  4. 使用索引字段作为条件时,如果该索引时符合索引,那么必须使用该索引中的第一个字段作为条件时才能保证系统使用改索引,否则该索引将不会被使用。
  5. 很多时候可考虑用exists 代替 in 。
  6. 尽量使用数字型字段。
  7. 尽可能的使用 verchar/ nvarchar  代替 char / nchar 。
  8. 任何地方都不要使用 select from t ,用具体的字段列表代替 "", 不要返回用不到的任何字段。
  9. 尽量使用表变量来代替临时表。
  10. 避免频繁创建和删除临时表,以减少系统表资源的消耗。
  11. 尽量避免使用游标,因为游标的效率较差。
  12. 在所有的存储过程和触发器的开始设置 SET NOCOUNT ON, 在结束时设置SET NOCOUNTOFF。
  13. 尽量避免大事务操作,提高系统并发能力。
  14. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 

11. Sql注入是如何产生的,如何防止?

  程序开发过程中不注意规范书写SQL语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些SQL语句正常执行。产生SQL注入。下面是防止办法:
  1. 过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。
  2. 在PHP配置文件中将Register_globals=off, 设置为关闭状态。
  3. SQL语句书写的时候尽量不要省略小引号和单引号
  4. 提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的。
  5. 对于常用的方法加以封装,避免直接暴露SQL语句。
  6. 使用MySQLI 或 pdo 预处理。

12. NoSQL和关系数据库的区别?

  1. SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存在方式可以是JSON文档,哈希表或者其他方式。
  2. 在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure) 等。表结构可以被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要定义表。
  3. SQL中如果需要增加外部关联数据的话,规范化做法是在表中增加一个外键,关联外部数据表。而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用非规范化方式把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候会比较麻烦。
  4. SQL中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NOSQL暂时未提供类似JOIN的发讯方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。
  5. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可随时删除任何数据。
  6. SQL中如果多张数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。
  7. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。

13. 数据库的设计?

  1. 第一范式:数据库表的每一列都是不可分割的原子数据项,即列不可拆分。
  2. 第二范式: 建立在第一范式的基础上,要求数据库表中的每个实例或记录必须是可以唯一被区分的,唯一标识。
  3. 第三范式:建立在第二范式的基础上,任何非主属性不依赖其他非主属性,即引用主键。

14. 存储过程和函数的区别?

  相同点:存储过程和函数都是为了可重复的执行操作数据库的SQL语句的集合。
  1. 存储过程和函数都是一次编译,就会被缓存起来,下次使用就命中已经编译好的SQL语句,不需要重复使用。减少网络交互,减少网络访问流量。
  不同点: 标识符不同,函数的标识符是function, 存储过程是proceduce。
  1. 函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in, out)来实现多个参数或者返回值。
  2. 存储函数使用select 调用,存储过程需要使用call 调用。
  3. select 语句可以再存储过程中调用,但是除了select .. into 之外的select 语句都不能在函数中使用。
  4. 通过 in  out 参数,过程相关函数更加灵活,可以返回多个结果。

15. MySQL日志

  错误日志: 记录启动,运行 或者 停止 MySQL时出现的问题。
  通用日志: 记录建立的客户端连接和执行的语句。
  二进制日志:记录所有更改数据的语句。
  慢查询日志:记录所有执行时间超过long_query_time 秒的查询或者不适用索引的查询 通过使用 -- slow_query_log{=0|1} 选项来启用慢查询日志,所有执行时间超多 long_query_time 的 语句都会被记录。

16. 优化数据库?提高数据库的性能?

1. 对语句的优化
	(1) 用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结构集,从而减轻网络负担。
	(2) 能够分开的操作尽量分开处理,提高每次的相应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;
	(3) 在查询时,不要过多地使用通配符如 select * from T1 语句,要用到几列就选择几列如:select col1, col2 form t1;
	(4) 在可能的情况下尽量限制尽量结果集行数如:select top 300 col1, col2, col3 from t1,因为某些情况下用户是不需要那么多的数据的。
	(5) 不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的, 面向集的SQL语句需要更大的开销,按照特定顺序提取数据的查找。
2. 避免使用不兼容的数据类型。
3. 避免在where子句中对字段进行函数或表达式操作。 若进行函数或表达式操作,将导致引擎放弃使用索引而进行全表扫描。
4. 避免使用 != 或 <> ,is null 或 not null , in, not in 等这样的操作符。
5. 尽量使用数字型字段
6. 合理使用exists , not , existe 子句。
7. 分利用连接条件。
8. 消除对大型表行数据的顺序存取。
9. 避免困难的正规表达式。
10. 避免坤能的正规表达式
11. 使用试图加速查询
12. 能够用 between 的就不要用 in 
13. distinct 的就不用 group by
14. 部分利用索引
15. 能用union all 就不要用 union
16. 不要写一些不做任何事的查询
17. 尽量不要用select into 语句
18. 必要时强制查询优化器使用某个索引。

最后

以上就是闪闪小蘑菇为你收集整理的Mysql的全部内容,希望文章能够帮你解决Mysql所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部