数据库 1 存储过程为什么比事务效率高存储过程经过预编译处理而SQL查询没有,SQL语句需要先被数据库引擎处理成低级的指令然后才执行 2 存储过程存储过程:一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它 创建: (1). 格式 MySQL存储过程创建的格式: CREATEPROCEDURE存储过程名(参数列表) BEGIN SQL语句代码块 END 举例: CREATE PROCEDURE proc1(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM user; END (2). 参数: MySQL存储过程参数有三种类型:in、out、inout。 如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型参数;如果仅仅从 MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给 MySQL存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout”类型参数。 (3).Mysql调用储存过程 Set @n=1 //声明变量 Call procName(@n) //调用储存过程 2.1 优点:存储过程是一组予编译的SQL语句, 它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。 允许更快执行,如果某操作需要执行大量SQL语句或重复执行,存储过程比SQL语句执行的要快。 减少网络流量,例如一个需要数百行的SQL代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。 2.2.存储过程和函数有什么区别? Oracle中的函数与存储过程的区别: A:函数必须有返回值,而过程没有. B:函数可以单独执行.而过程必须通过execute执行. C:函数可以嵌入到SQL语句中执行.而过程不行. 其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数. Oracle中的函数与存储过程的特点: A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 C.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 3 数据库的读写分离读写分离,基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库 4 数据库分库分表分库分表方式: 纵向切割:把不同业务的表放到不同的数据库中 横向切割:把同一张表的数据拆分存储到不同数据库中,表结构一样 拆分规则:根据主键编号,对主键进行hash处理 Mycat数据库中间件,可以支持mysql分片 Mycat读写分离:mysql的主从复制 Mycat在查询数据时等待主从数据库数据同步(binlog)结束后再查 5 词汇概念主键:能确定一条记录的唯一标识 外键:用于与另一张表建关联,用于保持数据的一致性 索引:提高查询速度 数据库会把设置为索引的字段的内容存储到一个独立的区间,里面只有这个字段的内容,查询的该字段值时会直接在这个独立区间查找,找到符合条件的值后再读取其指向真实的数据记录的物理地址,再把对应数据内容输出,如果不是索引,会从数据表里查找,数据表会有很多不相关的字段,都会被扫描查询效率就低 触发器:数据库触发器是一个与表相关联的、存储的PL/SQL 程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle 自动地执行触发器中定义的语句序列 视图:将我们写的sql语句进行封装;一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询的结果 游标:游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制,游标充当指针的作用 左外连接:以左表为基准进行查询,左表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配,则显示为NULL; 右外连接:以右表为基准进行查询,右表数据会全部显示出来,右表如果和左表匹配的数据则显示相应字段的数据,如果不匹配,则显示为NULL; 全连接:先以左表进行左外连接,然后以右表进行右外连接。 内连接:显示表之间有连接匹配的所有行 聚合函数:对一组值执行计算并返回单一的值的函数,它经常与SELECT语句的GROUPBY子句一同使用 SQLSelect语句完整的执行顺序:from--->where--->group by--->having--->计算所有的表达式--->orderby--->select输出 6 数据库索引分类唯一索引:UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值,对于多列惟一性索引,保证多个值的组合不重复 主键索引:primarykey 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型 聚集索引(也叫聚簇索引):cluster:在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同 表记录比较少的时候不建议建立索引,经常有更新操作的表建议建立比较少的索引,索引需要维护,对于经常查询的表,可以建立适当数量的索引,一般4,5个 7 Sql性能优化通常我们所能做的也只用语句优化,其他相关方面只有数据库维护人员去做 语句优化: 尽量避免全扫面表,避免索引失效:尽量少使用关键字:in,notin,is null,is not null 当只要一行数据时使用 LIMIT 1 使用数据库缓存 读写分离,分库分表 经常作查询的字段做索引 8 事务的隔离级别(举例(出现的问题))事务隔离级别(isolationlevel):在于处理多事务的并发问题 脏读: 一个事务读到另一个事务已修改但未提交的数据 不可重复度: 事务T1读取一行数据,T2修改了T1刚刚读取的记录,T1再次查询,发现与第一次读取的记录不相同(主要是指update) 虚读,幻读: 一个线程中的事务读取到了另外一个事务中提交的insert的数据(主要是指insert) serializable:最严格级别,事务串行执行,资源消耗大(锁表) repeatableread:避免了脏读和不可重复读,带来更多性能损失(mysql默认) readcommitted:大多数主流数据库默认隔离级别,避免了脏读(oracle默认) readuncommitted:最低级别,任何情况都无法保证 9批量插入: http://blog.csdn.net/frinder/article/details/38830723 数据库优化1怎么优化数据库(在数据百万条记录的数据库中 Oracle)? 使用索引 建立分区,分区索引 使用存储过程 2 如何优化SQL语句 1. 对操作符的优化 尽量不采用不利用索引的操作符 如:in ,not in, is nul, is not null,<>等 2. 对条件字段的一些优化 采用函数处理的字段不能利用索引, 进行了显式或隐式的运算的字段不能进行索引 条件内包括了多个本表的字段运算时不能进行索引 3. 在业务密集的SQL当中WHERE后面的条件顺序影响 4. 应用ORACLE的HINT(提示)处理 5. 查询表顺序的影响
|