Mysql的一些问题

sql语句应该考虑哪些安全性?
答:
(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量。
(2)最小权限原则,特别是不要用root帐户,为不一样的类型的动做或者组建使用不一样的帐户。
(3)当sql运行出错时,不要把数据库返回的错误信息所有显示给用户,以防止泄漏服务器和数据库相关信息。mysql

简单描述MySQL中,索引,主键,惟一索引,联合索引的区别,对数据库的性能有什么影响。
答:
(1)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里全部记录的引用指针。
(2)普通索引(由关键字KEY或INDEX定义的索引)的惟一任务是加快对数据的访问速度。
(3)普通索引容许被索引的数据列包含重复的值,若是能肯定某个数据列只包含彼此各不相同的值,在为这个数据索引建立索引的时候就应该用关键字UNIQE把它定义为一个惟一因此,惟一索引能够保证数据记录的惟一性。
(4)主键,一种特殊的惟一索引,在一张表中只能定义一个主键索引,逐渐用于惟一标识一条记录,是用关键字PRIMARY KEY来建立。
(5)索引能够覆盖多个数据列,如像INDEX索引,这就是联合索引。
(6)索引能够极大的提升数据的查询速度,可是会下降插入删除更新表的速度,由于在执行这些写操做时,还要操做索引文件。sql

一张表,里面有ID自增主键,当insert了17条记录以后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18仍是15 ?
答:
(1)若是表的类型是MyISAM,那么是18。
由于MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。
(2)若是表的类型是InnoDB,那么是15。
InnoDB表只是把自增主键的最大ID记录到内存中,因此重启数据库或者是对表进行OPTIMIZE操做,都会致使最大ID丢失。数据库

请简述项目中优化sql语句执行效率的方法,从哪些方面。sql语句性能如何分析?
答:
(1)尽可能选择较小的列
(2)将where中用的比较频繁的字段创建索引
(3)select子句中避免使用‘*’
(4)避免在索引列上使用计算,not,in和<>等操做
(5)当只须要一行数据的时候使用limit 1
(6)保证表单数据不超过200w,适时分割表
(7)针对查询较慢的语句,可使用explain来分析该语句具体的执行状况
mysql_fetch_row()和mysql_fetch_array()的区别
答:这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,咱们只能row[0],row[1],这样以数组下标来读取数据,而mysql_fetch_array()返回的数组既包含第一种,也包含键值对的形式,咱们能够这样读取数据,(假如数据库的字段是 username,passwd):row[‘username‘],row[‘passwd‘。数组

数据库事务的四个特性及含义安全

数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的全部操做,要么所有完成,要么所有不完成,不可能停滞在中间某个环节。事务在执行过程当中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务历来没有执行过同样。
一致性:在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的惟一操做。若是有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操做间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成之后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。服务器

视图的做用数据结构

视图是虚拟的表,与包含数据的表不同,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图能够简化复杂的sql操做,隐藏具体的细节,保护数据;视图建立后,可使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,若是视图自己内有order by 则对视图再次order by将被覆盖。
建立视图:create view XXX as XXXXXXXXXXXXXX;
对于某些视图好比未使用联结子查询分组汇集函数Distinct Union等,是能够对其更新的,对视图的更新将对基表进行更新;可是视图主要用于简化检索,保护数据,并不用于更新,并且大部分视图都不能够更新数据库设计

drop,delete与truncate的区别函数

drop直接删掉表 truncate删除表中数据,再插入时自增加id又从1开始 delete删除表中数据,能够加where字句。性能

(1) DELETE语句执行删除的过程是每次从表中删除一行,而且同时将该行的删除操做做为事务记录在日志中保存以便进行进行回滚操做。TRUNCATE TABLE 则一次性地从表中删除全部的数据并不把单独的删除操做记录记入日志保存,删除行是不能恢复的。而且在删除的过程当中不会激活与表有关的删除触发器。执行速度快。

(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操做不会减小表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

(3) 通常而言,drop > truncate > delete

(4) 应用范围。TRUNCATE 只能对TABLE;DELETE能够是table和view

(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

(6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

(7) delete语句为DML(data maintain Language),这个操做会被放到 rollback segment中,事务提交后才生效。若是有相应的 tigger,执行的时候将被触发。

(8) truncate、drop是DLL(data define language),操做当即生效,原数据不放到 rollback segment中,不能回滚

(9) 在没有备份状况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,若是于事务无关,用truncate便可实现。若是和事务有关,或老师想触发trigger,仍是用delete。

(10) Truncate table 表名 速度快,并且效率高,由于:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:两者均删除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 经过释放存储表数据所用的数据页来删除数据,而且只在事务日志中记录页的释放。

(11) TRUNCATE TABLE 删除表中的全部行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。若是想保留标识计数值,请改用 DELETE。若是要删除表定义及其数据,请使用 DROP TABLE 语句。

(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。因为 TRUNCATE TABLE 不记录在日志中,因此它不能激活触发器。

索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现一般使用B树及其变种B+树。

建立索引能够大大提升系统的性能。

第一,经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性。

第二,能够大大加快数据的检索速度,这也是建立索引的最主要的缘由。

第三,能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,一样能够显著减小查询中分组和排序的时间。

第五,经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。

也许会有人要问:增长索引有如此多的优势,为何不对表中的每个列建立一个索引呢?由于,增长索引也有许多不利的方面。

第一,建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。

第二,索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大。

第三,当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。

索引是创建在数据库表中的某些列的上面。在建立索引的时候,应该考虑在哪些列上能够建立索引,在哪些列上不能建立索引。通常来讲,应该在这些列上建立索引:在常常须要搜索的列上,能够加快搜索的速度;在做为主键的列上,强制该列的惟一性和组织表中数据的排列结构;在常常用在链接的列上,这些列主要是一些外键,能够加快链接的速度;在常常须要根据范围进行搜索的列上建立索引,由于索引已经排序,其指定的范围是连续的;在常常须要排序的列上建立索引,由于索引已经排序,这样查询能够利用索引的排序,加快排序查询时间;在常用在WHERE子句中的列上面建立索引,加快条件的判断速度。

一样,对于有些列不该该建立索引。通常来讲,不该该建立索引的的这些列具备下列特色:

第一,对于那些在查询中不多使用或者参考的列不该该建立索引。这是由于,既然这些列不多使用到,所以有索引或者无索引,并不能提升查询速度。相反,因为增长了索引,反而下降了系统的维护速度和增大了空间需求。

第二,对于那些只有不多数据值的列也不该该增长索引。这是由于,因为这些列的取值不多,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即须要在表中搜索的数据行的比例很大。增长索引,并不能明显加快检索速度。

第三,对于那些定义为text, image和bit数据类型的列不该该增长索引。这是由于,这些列的数据量要么至关大,要么取值不多。

第四,当修改性能远远大于检索性能时,不该该建立索引。这是由于,修改性能和检索性能是互相矛盾的。当增长索引时,会提升检索性能,可是会下降修改性能。当减小索引时,会提升修改性能,下降检索性能。所以,当修改性能远远大于检索性能时,不该该建立索引。

根据数据库的功能,能够在数据库设计器中建立三种索引:惟一索引、主键索引和汇集索引。

惟一索引

惟一索引是不容许其中任何两行具备相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不容许将新建立的惟一索引与表一块儿保存。数据库还可能防止添加将在表中建立重复键值的新数据。例如,若是在employee表中职员的姓(lname)上建立了惟一索引,则任何两个员工都不能同姓。 主键索引 数据库表常常有一列或列组合,其值惟一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动建立主键索引,主键索引是惟一索引的特定类型。该索引要求主键中的每一个值都惟一。当在查询中使用主键索引时,它还容许对数据的快速访问。 汇集索引 在汇集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个汇集索引。

若是某索引不是汇集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非汇集索引相比,汇集索引一般提供更快的数据访问速度。

相关文章
相关标签/搜索