MYSQL

mysql 存储引擎

答:常用的主要分为两种,一种是 innodb,一种是 myisam,两者的主要区别是
①myisam 不支持事务处理,而 innoDB 支持事务处理
②myisam 不支持外键,innoDB 支持外键
③myisam 支持全文检索,而 innoDB 在 MySQL5.6 版本之后才支持全文检索
④数据的存储形式不一样,mysiam 表存放在三个文件:结构、索引、数据,innoDB 存
储把结构存储为一个文件,索引和数据存储为一个文件
⑤myisam 在查询和增加数据性能更优于 innoDB,innoDB 在批量删除方面性能较高。
⑥myisam 支持表锁,而 innoDB 支持行锁

sql 注入是什么及如何预防 sql 注入?

答:SQL 注入攻击指的是用户或者黑客通过构建特殊的输入作为参数传入我们的 Web 应
用程序端,而这些输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击
者所要的操作,其主要原因是程序员没有细致地过滤用户输入的数据,致使非法数据侵
入系统而造成的。因此我们在做开发过程中一定要预防 sql 注入,主要从两方面着手:
1、占位符的方式,就是对 sql 语句进行预处理,然后执行 sql 语句
2、通过 addslashes 或者 mysql_real_escape_string 这两个函数对用户输入的值进行
转义处理,把一些特殊的字符转义掉。

有用过预处理么?

答:用过,PDO 类中,有个 prepare 方法可以实现预处理,PDOStament 类中的 excute
方法可以执行预处理,预处理的参数分为两种,一种是:字符串占位符,另一种是?占位
符,:字符串占位符在执行预处理传递参数时传入的是关联数组,而?占位符传递的是索
引数组。两者不能混合使用,但一般推荐使用:字符串占位符。

mysql 优化怎么做的?

答:mysql 优化主要从以下几个方面来实现:
①设计角度:存储引擎的选择,字段类型选择,范式
②功能角度:可以利用 mysql 自身的特性,如索引,查询缓存,碎片整理,分区、分
表等
③sql 语句的优化方面:尽量简化查询语句,能查询字段少就尽量少查询字段,优化分
页语句、分组语句等。
④部署大负载架构体系:数据库服务器单独出来,负载大时可以采用主从复制,读写
分离机制进行设计
⑤从硬件上升级数据库服务器。

sql 语句的优化

答:首先我们得确定哪些 sql 语句需要优化,一般在一个系统中,查询语句最多,所以
我们主要是针对查询语句进行优化。主要采用两种方式来确定要优化的 sql 语句:
①使用慢查询日志,设置需要优化的 sql 语句的执行时间,记录下超过该设置时间
的语句,即为需要优化的语句。
②使用 profiling 机制,记录下每条 sql 语句的执行时间,找出执行较慢的语句,
即为需要优化的语句。
我们主要通过给表字段添加索引的方式进行优化,加上索引后,sql 语句的执行时间
显著提高了,但并不是加上索引了这条 sql 语句就会用到索引,所以首先看执行慢的语
句后面是否有加索引,我们可以使用 explain 或者 desc 加在要执行的 sql 语句前,查
看是否使用到索引。有几个地方需要注意的是:
①为了避免建议索引而造成索引文件过大,有时候我们会使用复合索引,这时候要遵
循最左原则。
②like 查询,前%不会用到索引
③如果条件中有 or,则要求 or 的索引字段都必须有索引,否则不能用到索引。
④如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。
⑤优化 group by 语句
⑥尽量避免模糊匹配,这样会导致全盘扫描

索引有几种

答:索引主要有:
主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有
多个主键索引。
普通索引:使用字段关键字建立的索引,主要是提高查询速度
唯一索引:字段数据是唯一的,数据内容里面能否为 null,在一张表里面,是可
以添加多个唯一索引。
全文索引:在比较老的版本中,只有 myisam 引擎支持全文索引,在 innodb5.6
后引擎也支持全文索引,在 mysql 中全文索引不支持中文。我们一般使用 sphinx 集合
coreseek 来实现中文的全文索引。

左前索引原则

答:左前索引主要指的是在复合索引中,给两个或多个字段建立了复合索引后,在 sql
语句后的条件中,只有复合索引前面的字段在条件的前面时,该索引才起作用,比如创
建了个复合索引 index (a,b),在使用 where 或者 orderby 条件时,如果只有条件 b
的,该索引不会生效,必须有条件 a 且必须要在条件 b 的前面该索引才会生效。

分布式数据库

答:我所知道的分布式数据库有 memcache,主要是分布式的非关系型数据库,用于缓存
处理。
分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在
一起,实现同一业务。
分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
举例:就比如新浪网,访问的人多了,他可以做一个群集,前面放一个响应服务器,后
面几台服务器完成同一业务,如果有业务访问的时候,响应服务器看哪台服务器的负载
不是很重,就将给哪一台去完成。
而分布式,从窄意上理解,也跟集群差不多, 但是它的组织比较松散,不像集群,有
一个组织性,一台服务器垮了,其它的服务器可以顶上来。
memcache 的应用场景
1、适用 memcached 的业务场景?
1)如果网站包含了访问量很大的动态网页,因而数据库的负载将会很高。由于大部分
数据库请求都是读操作,那么 memcached 可以显著地减小数据库负载。
2)利用 memcached 可以缓存 session 数据、临时数据以减少对他们的数据库写操作。
4)缓存一些很小但是被频繁访问的文件。
5)访问比较频繁,安全性不高,丢失无所谓,修改比较频繁的数据,比如一些用户的
在线状态
2 、不适用 memcached 的业务场景?
1)缓存对象的大小大于 1MB
memcache 本身就不是为了处理庞大的多媒体( large media)和巨大的二进制块
(streaming huge blobs)而设计的。
2)key 的长度大于 250 字符
3)应用运行在不安全的环境中
4)业务本身需要的是持久化数据或者说需要的应该是 database

.

Mysql 事务的特性

事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为
ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须
应用于事务的修改,以保持所有数据的完整性。
事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离性
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据
所处的状态,要么是另一并发事务修改它之前的状态,
要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可
串行性,因为它能够重新装载起始数据,
并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
begin 开始一个事务
rollback 事务回滚
commit 事务确认

Mysql 事务的应运场景

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操
作大都需要用到事务处理。比如说,在人员管理系统中,你删除一个人员,你即需要删
除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数
据库操作语句就构成一个事务!
比如手机充值过程,支付宝金额减少,相应的手机话费增加,只要有一个操作不成功,
则另外一个操作也不会成功

索引的建立与使用

索引就是类似书的目录,提高检索数据的效率。
索引是系统按照某个具体的算法(哈希,散列,二叉树),将数据从全部数据里进行提
取,维护成一个索引文件,然后系统在进行数据查询的时候,发现如果查询条件刚好满
足索引条件,就可以从索引文件中快速的定位的数据所在位置。
mysql 中有以下几种索引:
主键索引(primary key 效率最高的索引)
唯一索引(unique key):不为空的情况下效率最高
普通索引(index)对数据没有要求,文件很大,效率比较低
全文索引(fulltext),对整个文章内部进行关键字索引(mysql5.5 以后 InnoDB 支持
全文索引)
英文的全文索引很简单:英文单词默认是用空格分离的
中文的全文索引很难:中文的词组成很麻烦,需要利用分词工具(sphinx)
索引可以在创建表的同时创建索引,也可以在修改表结构时添加索引,索引主要
是加在经常做为查询条件的字段上,可以使用相应的手段来检测所执行的 sql 语句中是
否使用到了索引。

mysql 优化,读写分离如何实现?

答:mysql 优化前面已经总结了。主要说下读写分离,当我们的数据量很大时,数据库
服务器的压力变大,这时候我们需要从架构方面来解决这一问题,在一个网站中读的操
作很多,写的操作很少,这时候我们需要配置读写分离,把读操作和写操作分离出来,
最大程度的利用好数据库服务器。读写分离的实现原理就是在执行 SQL 语句的时候,判
断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),
写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。当然为了保证
多台数据库数据的一致性,需要主从复制。主从复制的实现原理是:mysql 中有一种日
志,叫做 bin 日志(二进制日志),会记录下所有修改过数据库的 sql 语句。主从复制
的原理实际是多台服务器都开启 bin 日志,然后主服务器会把执行过的 sql 语句记录到
bin 日志中,之后从服务器读取这个 bin 日志,把该日志的内容保存到自己中继日志里
面,从服务器再把中继日志中记录的 sql 语句同样的执行一遍。这样从服务器上的数据
就和主服务器相同了。

索引的优缺点

1、优点:
a)可以保证数据库表中每一行的数据的唯一性
b)可以大大加快数据的索引速度
c)加速表与表之间的连接,物别是在实现数据的参考完事性方面特别有意义
d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时

f)通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能
2、缺点:
创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,
如果需要建立聚簇索引,那么需要占用的空间会更大
以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
建立索引的原则
在经常需要搜索的列上,可以加快搜索的速度
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
在经常用在连接的列上,这些列主要是一外键,可以加快连接的速度
在经经常需要根据范围进行搜索的列上创建索引,国为索引已经排序,其指定的范围是连续

在经常需要排序的列上,国为索引已经排序,这样井底可以利用索引的排序,加快排序井底
时间
在经常使用在 where 子句中的列上,加快条件的判断速度

创建索引的原则

索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该 仔细考虑在哪
些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,
例如:在经常需要搜索的列上,可以加快搜索的速度;在作为 主键的列上,强制该列
的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可
以加快连接的速度;在经常需要根据范围进行搜索 的列上创建索引,因为索引已经排序,
其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可
以利用索引的排序,加快排序查询 时间;在经常使用在 WHERE 子句中的列上面创建索引,
加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的 这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引 。这是因为,既然这些列很
少使用到,因此有索引或者无索引,并不能提高查 询速度。相反,由于增加了索引,反而
降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的 取值很
少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,
即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加 快检索速度。
第三,对于那些定义为 text, image 和 bit 数据类型的列不应该增加索引。这是因为,这些列
的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建
索 引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,
但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因 此,当修改性
能远远大于检索性能时,不应该创建索引。

Sql 语句优化方式:

1:避免在 where 语句中使用 is null 或 is not null
我们在设置字段的时候尽量不要把默认值设置为空 因为就算我们给 name 加了索引
他也不会应用到索引
2:尽量不要使用 in 或 not in
In 和 not in 会导致全表扫描 我们应该使用 between and 来代替
3:注意 like 通配符的使用
我们尽量查询的时候不要使用%值%因为这样不会应用到索引 我们一般需要值%这样
4:最好使用 exists 来代替 in
in 和exists如果查询语句使用了 in 那么内外表都进行全表扫描,没有用到索引;而extsts
的子查询依然能用到表上的索引用 exists 都比 t in 要快。
5:避免在 where 语句中使用 !=和<>符号
Mysql 只对< = >以及 between 特定的 like 才会使用索引
6:尽量避免在 sql 语句中进行函数操作
放弃索引而进行全表扫描
7:应尽量在 sql 语句中少使用对字段进行表达式操作
放弃索引而进行全表扫描
8:count(*)更优化于具体字段
9:在使用 group by 的时候 默认分组后还会排序 这样会降低查询速度
可以在 group by 后边加入 order by null 就可以防止排序 增大我们的排序速度
10:用 where 语句代替 having 语句
避免使用 Having 子句,having 只会在检索出所有记录之后才对结果集进行过滤 这个处
理需要排序 总计等操作 如果能通过 where 子句限制记录的数目,那就能减少这方面的开

优化 MYSQL 数据库的方法。

选取最适用的字段属性,应该尽量把字段设置为 NOT NULL,这样在将来执行查
询的时候,数据库不用去比较 NULL 值。
使用连接(JOIN)来代替子查询(Sub-Queries)
使用联合(UNION)来代替手动创建的临时表
尽量少使用 LIKE 关键字和通配符
使用事务和外键
使用外键,优化锁定表
建立索引
优化查询语句

Mysql 集群如何确保数据一致性

什么是数据一致性?这里仅仅针对 mysql,或是关系型数据库,一致性主要包括
两方面,表结构一致和数据内容一致。一般情况下,表结构变更相对是少的,而
且不一致的概率也很小,即使检查,也相对容易;而导致数据内容不一致的情况
很多,所以我们更关心的数据内容的一致性。
如何实现数据一致性校验?一种思路就是逐行逐字段比较主库和备库的
表;另外一种思路是,不逐行逐字段比较,取而代之的是分别对主库和备库计算
校验和,通过判断校验和是否相同,确定主备库数据是否一致。
两种思路都很简单,第一种思路正确性高,但性能比较差,因为返回大量的结果
集导致大量的网络 IO 和磁盘 IO;而第二种思路则恰好相反,性能会更好,少了
IO,多消耗了一些 CPU 资源(计算校验和),正确性不如第一种思路。但是考虑到
生产环境下,数据时时刻刻都是动态变化的,就没那么简单了。通过对表加锁,
可以保证我们在校验时,数据是静态的,待我们顺利完成校验后,再解锁。mysql
自带命令 CHECKSUM TABLE,就是通过锁表方式来保证数据是静态的。这种方式
对于小表,访问量小的表还好,若表非常大,校验需要很长时间,生产环境是不
能容忍的。既然要保持静态就需要锁表,可不可以缩短锁表时间呢?
pt-table-checksum 通过将表分片,每次只对一部分行上锁,这样在校验过程中,
一时刻只有部分行被锁住,减少对业务的影响。

left join 和 ioin join 区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记
录 ,left join 是以 A 表的记录为基础的,A 可以看成左表,B 可以看成右表,left
join 是以左表为准的.
ioin join(等值连接) 只返回两个表中联结字段相等的行,它只显示符合条件的
记录.

MySQL 最大连接数

查看当前的 Max_connections 参数值:,一般为 100
mysql> SELECT @@MAX_CONNECTIONS AS ‘Max Connections’;
设置该参数的值:
mysql> set GLOBAL max_connections=1000;

事物的四大特性和事物的隔离级别

原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事
务执行之前和执行之后都必须处于一致性状态。
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的
事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在
数据库系统遇到故障的情况下也不会丢失提交事务的操作。
不考虑事务的隔离性,会发生的几种问题:
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据
值,这是由于在查询间隔,被另一个事务修改并提交了
虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务 T1 对一个表中所有的行的某个数据项
做了从“1”修改为“2”的操作,这时事务 T2 又对这个表中插入了一行数据项,而这个数据项
的数值还是为“1”并且提交给数据库。而操作事务 T1 的用户如果再查看刚刚修改的数据,会
发现还有一行没有修改,其实这行是从事务 T2 中添加的,就好像产生幻觉一样,这就是发生了
幻读。
现在来看看 MySQL 数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

b+tree 和 hash 索引的区别

(1)MySQL Hash 索引仅仅能满足"=",“IN"和”"查询,不能使用范围查询。

由于MySQL Hash 索引比较的是进行Hash 运算之后的Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的Hash 算法处理之后的Hash 值的大小关系,并不能保证和Hash 运算前完全一样。

(2)MySQL Hash 索引无法被用来避免数据的排序操作。

由于MySQL Hash 索引中存放的是经过Hash 计算之后的Hash 值,而且Hash 值的大小关系并不一定和Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。

(3)MySQL Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算Hash 值时是组合索引键合并后再一起计算Hash 值,而不是单独计算Hash 值,所以通过组合索引的前面一个或几个索引键进行查询时,Hash 索引也无法被利用。

(4)MySQL Hash 索引在任何时候都不能避免表扫描。

上面已经提到,Hash 索引是将索引键通过Hash 运算之后,将Hash 运算结果的Hash 值和所对应的行指针信息存放于一个Hash 表中,由于不同索引键存在相同的Hash 值,所以即使取满足某个Hash 键值的数据的记录条数,也无法从Hash 索引中直接完成查询,仍要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)MySQL Hash 索引遇到大量Hash 值相等的情况后性能并不一定就会比B-Tree 索引高。

对于选择性比较低的索引键,如果创建Hash 索引,那么将会存在大量记录指针信息存于同一个Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,从而造成整体性能低下。

sql语句(limit 与 offset:从下标0开始)的用法

offset X 是跳过X个数据

limit Y 是选取Y个数据

limit X,Y 中X表示跳过X个数据,读取Y个数据

例如: select * from table limit 2,1; // 跳过2个数据,读取1个数据

常与order by使用:如,

   //从Employee(员工)表中,读取第二高的salary(薪水),排序后,跳过第一个下标,读取一个元素
         select distinct Salary
         from Employee
         order by Salary desc
         limit 1 offset 1; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值