- 浏览: 912690 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
天天来注册:
...
try catch finally 用法 -
tadpole_java:
谢谢你的分享。
二十七、Qt数据库(七)QSqlRelationalTableModel(转) -
359449749tan:
android之EditText文本监听(addTextChangedListener) -
michael_wang:
人过留名 多谢分享
Android NOtification 使用 -
wilsonchen:
wangqi0614 写道这个删除是删除所有的把?能不能值删除 ...
Android的SharedPreferences保存与删除数据简单实例
引用
第一部分:引擎选择
MySQL 存储引擎该如何选择
一、InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及设计到安全性就高的应用
三、InnoDB支持外键,MyISAM不支持
四、MyISAM是默认引擎,InnoDB需要指定
五、InnoDB不支持FULLTEXT类型的索引
六、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表
七、对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
八、清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表
九、InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'
通过以上九点区别,结合个人博客的特点,推荐个人博客系统使用MyISAM,因为在博客里主要操作是读取和写入,很少有链式操作。所以选择MyISAM引擎使你博客打开也页面的效率要高于InnoDB引擎的博客,当然只是个人的建议,大多数博客还是根据实际情况下谨慎选择。我的小站目前就使用MyISAM引擎!
第二部分:数据库性能的优化
主要分三个方面进行优化:优化查询,优化数据结构,优化MySQL服务器。
优化查询
但是有些时候即使查询时使用的是索引,但索引并没有起作用。比如使用了LIKE关键字进行查询时,如果匹配字符串的第一个字符为‘%’,索引不会被使用。如果‘%’不是在第一个位置,索引就会被使用。
优化子查询
很多查询中需要使用子查询。子查询可以使查询语句很灵活,但子查询的执行效率不高。MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询 语句在临时表中查询记录。查询完毕后,MySQL需要插销这些临时表。所以在MySQL中可以使用连接查询来代替子查询。连接查询不需要建立临时表,其速 度比子查询要快。
优化数据库结构
1将字段很多的表分解成多个表
有些表在设计时设置了很多的字段。但是这个表中的有些字段的使用频率很低。当这个表的数据量很大时,查询数据的速度就会很慢。对于这种字段特别多的并且有字段的使用频率不高的表,就可以将其分解成多个表。
2增加中间表
有时需要经常查询某两个表中的几个字段。如果经常进行联表查询,就会降低MySQL数据库的查询速度。对于这种情况可以建立中间表来提高查询速度。
3增加冗余字段
设计数据库表时尽量让表达到三范式。但是,有时为了提高查询速度,可以有意识的在表中增加冗余字段。表的规范程度越高,表与表之间的关系就越多,查询时可 能经常需要在多个表之间进行连接查询,而进行连接查询会降低查询速度。
4优化插入记录的速度
插入记录时,索引和唯一性校验都会影响到插入记录的速度。而且,一次插入多条记录和多次插入一条记录所消耗的时间是不一样的。根据这些情况,分别进行不同的优化。
禁用索引:插入记录时,MySQL会根据表的索引对插入的记录进行排序。如果插入大量数据时,这些排序会降低插入的速度。为了解决这种情况,在插入记录之 前先禁用索引。等插入之后再启用索引。对于新创建的表,可以先不创建索引,等记录都导入以后再创建索引。这样可以提高导入数据的速度。
ALTER TABLE 表名 DISABLE KEYS;
ALTER TABLE 表名 ENABLE KEYS;
优化INSERT语句:当大量插入数据时,建议使用一个INSERT语句插入多条记录,而不是使用多次INSERT语句。这样可以减少与数据库之间的连接等操作。
5分析表,检查表,和优化表
分析表的主要作用是分析关键字的分布。检查表的作用是检查表是否存在错误。优化表主要作用是消除删除或者更新造成的空间浪费。
分析表 ANALYZE TABLE 表名; 使用ANALYZE TABLE分析表的过程中,数据库系统会对表加一个只读锁。在分析表的过程中,只能读取表的内容,不能插入和更新表的内容。ANALYZE TABLE 语句能够分析InnoDB和MyISAM类型的表。
检查表使用CHECK TABLE语句。在执行过程中也会给表加上只读锁。
优化表使用OPTIMIZE TABLE语句。只能优化表中的VARCHAR,BLOB,TEXT类型的字段。OPTIMIZE TABLE语句可以消除删除和更新造成的磁盘碎片,从而减少空间浪费。因为如果一个表使用了TEXT或者BLOB这样的数据类型,那么更新,删除等操作就 会造成磁盘空间的浪费。因为,更新和删除操作以后,以前分配的磁盘空间不会自动回收。使用OPTIMIZE TABLE语句可以将这些磁盘碎片整理出来,以便再利用。
优化MySQL服务器
硬件上的优化:增加内存和提高磁盘读写速度,都可以提高MySQL数据库的查询,更新的速度。另一种提高MySQL性能的方式是使用多块磁盘来存储数据。因为可以从多块磁盘上并行读取数据,这样可以提高读取数据的速度。
MySQL参数的优化:内存中会为MySQL保留部分的缓冲区。这些缓冲区可以提高MySQL的速度。缓冲区的大小都是在MySQL的配置文件中进行设置的。
下面对几个重要的参数进行详细介绍:
key_buffer_size:表示索引缓存的大小。这个值越大,使用索引进行查询的速度就越快
table_cache:表示同时打开的表的个数。这个值越大,能同时打开的表的个数就越多。这个值不是越大越好,因为同时打开的表过多会影响操作系统的性能。
query_cache_size:表示查询缓冲区的大小。使用查询缓存区可以提高查询的速度。这个方式只使用与修改操作少且经常执行相同的查询操作的情况;默认值是0.
Query_cache_type:表示查询缓存区的开启状态。0表示关闭,1表示开启。
Max_connections:表示数据库的最大连接数。这个连接数不是越大越好,因为连接会浪费内存的资源。
Sort_buffer_size:排序缓存区的大小,这个值越大,排序就越快。
Innodb_buffer_pool_size:表示InnoDB类型的表和索引的最大缓存。这个值越大,查询的速度就会越快。这个值太大了就会影响操作系统的性能。
合理配置这些参数可以提高MySQL数据库的性能。配置完参数后,需要重启MySQL服务才会生效
第三部分:数据库的存储过程
一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。
存储过程通常有以下优点:
(1)存储过程在服务器端运行,执行速度快。
(2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。
(3)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。
(4) 存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型:IN、OUT、INOUT。
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回
小结:如果仅仅想把数据传给 MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从 MySQL 存储过程返回值,那就使用“out” 类型参数;如果需要把数据传给 MySQL 存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout” 类型参数。
第四部分:SQL语句的执行过程
http://www.cnblogs.com/kerrycode/p/3356845.html
SQL语句的执行过程一般如下:
解析(PARSE)—— 绑定(BIND)——执行(EXECUTE)——提取(FETCH 只有SELECT才需要这步)
解析
服务器进程接收到一个SQL语句时,首先要将其转换成执行这个SQL语句的最有效步骤,这些步骤被称为执行计划。
Step 1:检查共享池中是否有之前解析相同的SQL语句后所存储的SQL文本、解析树和执行计划。如果能从共享池的缓存库中找到之前解析过生成的执行计划,则SQL语句则不需要再次解析,便可以直接由库缓存得到之前所产生的执行计划,从而直接跳到绑定或执行阶段,这种解析称作软解析。
但是如果在共享池的库缓存中找不到对应的执行计划,则必须继续解析SQL、生成执行计划,这种解析称作硬解析
Step 2:语法分析,分析SQL语句的语法是否符合规范,衡量语句中各表达式的意义
Step 3:检查是否存在语义错误和权限。语义分析,检查语句中设计的所有数据库对象是否存在,且用户有相应的权限。
Step 4:视图转换和表达式转换 将涉及视图的查询语句转换为相应的对基表查询语句。将复杂表达式转化较为简单的等效连接表达式。
Step 5:决定最佳执行计划。优化器会生成多个执行计划,在按统计信息带入,找出执行成本最小的执行计划,作为执行此SQL语句的执行计划
Step 6:将SQL文本、解析树、执行计划缓存到库缓存,存放地址以及SQL语句的哈希值。
绑定
如果SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值。则此时将变量值带入执行计划。
执行
此阶段按照执行计划执行SQL,产生执行结果。不同类型的SQL语句,执行过程也不同。
SELECT查询
检查所需的数据块是否已经在缓冲区缓存中,如果已经在缓冲区缓存中,直接读取器内容即可。这种读取方式称为逻辑读取。如果所需数据不在缓冲区缓存中,则服务器进程需要先扫描数据块,读取相应数据块到缓冲区缓存,这种读取方式称为物理读。和逻辑读相比较,它更加耗费CPU和IO资源。
修改操作(INSERT、UPDATE、DELETE)
Step 1:检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则执行Step 3
Step 2:若所需的数据库并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中
Step 3:对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁
Step 4:将撤销数据的Redo记录复制到日志缓冲区,产生数据行的撤销数据,将数据行修改的Redo记录复制到日志缓冲区,修改数据行。
Step 5: 产生数据修改的撤销数据
Step 6:复制数据修改的Redo记录到日志缓冲区
Step 7:修改数据行的内容,如果之前的缓冲为干净缓冲,则此时将变为脏缓冲。
提取
提取只有SELECT查询语句才有的步骤。获取查询的记录行,必要的时候对查询结果排序。
第五部分:两种索引方式(B+tree和hashcode)
http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html
第六部分:数据库的事物
http://blog.csdn.net/leshami/article/details/5717020
发表评论
-
SQL语句的练习
2014-04-18 15:42 838第一题:查询101课程比102课程成绩高的所有学生的学号 ... -
SQL语句大全(转链接)
2014-04-12 00:00 921http://www.cnblogs.com/yubinfen ... -
Oracle SID在本机上已经存在,请指定一个不同的SID”的解决办法
2012-08-23 17:36 1333windows 系统: 1、 开始->设置->控制面板-> ... -
PHP环境配置:Apach+Tomcat+mysql+php
2011-11-05 15:22 67491》下载需要的软件: Apache : apa ... -
主键与外键
2011-10-13 20:08 1068一、什么是主键、外键 ... -
编译数据库ODBC
2011-08-17 19:15 1110单独编译~\src\plugins\sqldrivers\od ... -
将xml中的数据导入到数据库
2011-08-07 17:06 1189最简单的读取,把xml的一级子元素当做一条记录插入数据库 ... -
图形安装MySql
2011-08-04 12:41 843http://www.360doc.com/content/1 ... -
MyEclipse连接Hibernate项目
2011-08-04 12:06 887http://hi.baidu.com/bigbig_88/b ... -
Java工作流引擎 JBoss jBPM 3.1.2 演示示例
2011-08-04 01:32 978jBPM是由JBoss开发的工作流和业务流程管理引擎,可以用于 ... -
关于Struts+JBPM+Hibernate+MYsql的结合
2011-08-04 01:28 857一,首先在eclipse里新建 ... -
Qt中combox连接数据库
2011-08-01 00:15 5100示例源码: #include "widget.h& ... -
SQL语句进行插入
2011-07-25 11:31 937Connection conn = null; Prepa ... -
MySQL压力测试工具
2011-07-03 09:36 1149第一、mysqlslap mysqlslap是一个m ... -
XML 数据库
2011-05-01 14:46 722http://msdn.microsoft.com/en-us ... -
POI+XOM+Java操作Excel与XML之间转换
2011-05-01 12:54 1234http://www.iteye.com/topic/6834 ... -
使用SQL语句查询表中重复记录并删除
2011-04-30 20:33 2183文章一: 假设有一样 ... -
利用oleDB对象,将数据库中全部表转换成XML文件
2011-04-30 19:27 787... -
poi文件下载地址 poi.jar
2011-04-26 11:46 1194http://xiao5461.blog.163.com/bl ... -
最近几天搭建MySql且连接问题总结
2011-04-26 11:19 8761.mysql的默认安装文件在 C:\Program File ...
相关推荐
### MySQL常见面试问题详解 #### 1. MySQL简介与特性 - **MySQL**:MySQL是一种关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前由Oracle公司维护。它以其高性能、高可靠性和易用性著称,在互联网行业...
以上是《深入理解MySQL核心技术》中涉及的主要内容,这些知识点对于数据库管理员、开发人员以及任何需要处理MySQL数据库的人来说,都是不可或缺的基础知识。深入学习和理解这些内容,能够提升你在MySQL领域的专业...
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于管理的特点在互联网行业中占据了重要地位。网易技术部的这份MySQL中文资料是针对那些希望深入理解和掌握MySQL技术的人群精心编纂的...
2. MySQL 的技术特点包括支持各种客户端程序和库的多线程 SQL 服务器、不同的后端、广泛的应用程序编程接口和管理工具。 二、存储引擎 1. MySQL 中的存储引擎包括 MyISAM、InnoDB、MEMORY 等。 2. MyISAM 是 MySQL...
MySQL是世界上最流行的关系型数据库管理系统之一,用于...在实际工作中,不断学习和总结,以及参考像“MySQL常见错误集锦”这样的资源,是提升数据库技能的关键。通过这些资料,可以迅速定位并解决问题,提高工作效率。
这篇博文和相关的PPT文件旨在探讨MySQL的最新发展和在实际应用中的实践经验,涵盖了源码分析和工具使用等多个方面。下面将详细阐述其中的知识点。 一、MySQL的新技术 1. InnoDB存储引擎优化:随着MySQL版本的升级...
官方中文文档是学习和掌握MySQL技术的重要资源,提供了全面的指南、参考手册以及最佳实践。 《MySQL官方中文文档》包含了以下几个主要部分: 1. **安装与升级**:这部分详述了在各种操作系统环境下安装MySQL的步骤...
这部分内容对于解决生产环境中常见的性能问题尤为实用。 最后,手册可能会涵盖一些进阶主题,如InnoDB存储引擎的特性、分区表的使用、存储过程和函数的编写,以及MySQL与其他应用程序(如PHP、Java等)的集成。 ...
3 MySQL的许可证和技术支持 3.1 MySQL的许可证政策 3.2 MySQL 使用的版权 3.2.1 可能的未来版权改变 3.3 MySQL商业性分发 3.4 许可证实例 3.4.1 销售使用 MySQL的产品 3.4.2 ...
《PHP+MySQL网络开发技术》是IT行业中一种重要的技术组合,用于构建动态、交互式的Web应用程序。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,特别适合于Web开发,可以嵌入到HTML中执行。而MySQL则...
本文将深入探讨MySQL的主要技术原理以及常见的高可用性解决方案。 首先,我们来看看MySQL的技术原理。MySQL的核心功能包括数据存储、查询处理、事务管理、并发控制等。它采用SQL(结构化查询语言)作为其主要的交互...
在Java Web开发过程中,MySQL数据库中的中文编码问题是非常常见的技术难题之一。如果处理不当,可能会导致中文显示乱码、数据插入失败等问题。本文将深入探讨MySQL中文编码的相关设置,并提供一种有效的解决方案。 ...
本文将深入探讨 MySQL 中的存储引擎和索引技术,帮助优化数据库性能。 首先,MySQL 提供了多种存储引擎,每种引擎都有其特定的功能和适用场景。MyISAM 是 MySQL 的默认引擎,它不支持事务处理,但速度快,适合于...
《深入理解MySQL核心技术》这本书无疑是帮助开发者深入了解MySQL内部机制和最佳实践的重要参考资料。 首先,MySQL的核心技术之一是SQL语言,它是所有数据库操作的基础。SQL(结构化查询语言)用于数据的查询、插入...
#### 三、MySQL常见高可用架构 **一主一从架构**: - **架构原理**:一个主数据库用于写入,多个从数据库用于读取,主数据库通过日志复制的方式将数据同步到从数据库。 - **关键技术**:主从复制、异步复制、半...
常见的DBMS包括MySQL、Oracle、DB2和SQL Server等。 - **SQL(Structured Query Language,结构化查询语言)**:用于访问和管理数据库的标准语言。几乎所有的DBMS都支持SQL,使得开发者能够在不同的数据库系统之间...
MySQL常见问题解决方案。mysql常见技术问题
总结以上内容,MySQL技术原理和常见高可用架构包括了体系结构、存储引擎、高可用架构设计等多个方面。掌握这些知识点对于数据库管理员来说是基础中的基础,也是确保数据库服务稳定、高效运行的重要保障。对于希望...