影响数据库慢的因素:
1、服务器硬件 :当数据容量大于服务器内存时,增加服务器内存。定时写入磁盘,而不是每次都写入磁盘,内存频率高,读取数据快。
(1)磁盘:1、传统磁盘
2、RAID磁盘
2、服务器系统
3、数据库存储引擎的选择
4、数据库参数配置
5、数据库结构设计和sql语句选择
MySQL行级锁、表级锁、页级锁详细介绍:
表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许
行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
页级,表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
1) 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2) 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3) 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
MySQL常用数据引擎:
1:MyISAM
(1)不支持事物
(2)存储结构:数据文件(.MYD),索引文件(.MYI)和结构文件(.frm),可以在不同服务器上拷贝数据文件和索引文件。
(3)加锁和并发
使用共享表空间存储方式时,Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件 存在,所 以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。而在使用单独表空间存储方式时,每个表的数据以一个单独的文件来存放,这个时候的单表限制,又变成文件系统的大小限制了。
共享表空间与独占表空间可以通过参数innodb_file_per_table来转换,若为1,则开启独占表空间,否则,开启共享表存储。
在服务器资源有限,单表数据不是特别多的情况下, 独立表空间明显比共享方式效率更高 . 但是MySQL 默认是共享表空间 。
共享表空间与独占表空间可以通过参数innodb_file_per_table来转换,若为1,则开启独占表空间,否则,开启共享表存储。
在服务器资源有限,单表数据不是特别多的情况下, 独立表空间明显比共享方式效率更高 . 但是MySQL 默认是共享表空间 。
具体的共享表空间和独立表空间优缺点如下:
共享表空间:
优点:
可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上)。数据和文件放在一起方便管理。
缺点:
所有的数据和索引存放到一个文件中以为着将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
独立表空间:在配置文件(my.cnf)中设置: innodb_file_per_table
优点:
1. 每个表都有自已独立的表空间。
2. 每个表的数据和索引都会存在自已的表空间中。
3. 可以实现单表在不同的数据库中移动。
4. 空间可以回收(除drop table操作处,表空不能自已回收)
a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
b) 对于使innodb-plugin的Innodb使用truncate table也会使空间收缩。
c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
单表增加过大,如超过100个G。
3、CSV存储引擎
(1)以CSV格式进行数据存储
(2)所有的列必须都不能为null
(3)不支持索引
(4)不适合大表,不适合在线处理
适合作为数据交换的中间表
Archive存储引擎:
(1)已Zlib对表数据进行压缩,磁盘I/O更少;
(2)数据存储在ARZ为后缀的文件中
(3)只支持insert和select操作
(4)只允许在自增ID上加索引
Memory存储引擎:
(1)所有数据保存在内存中,数据易丢失
(2)支持HASH(等值查找)索引和BTree(范围查找)索引
(3)所有字段都为固定长度varchar(10)和char(10)
(4)不支持BLOG和TEXT等大字段
(5)使用表级锁
使用场景:
(1)用于查找或者映射表,例如邮编和地区的对应表
(2)用于保存数据分析中产生的中间表
(3)用于缓存周期性聚合数据的结果
Federated引擎:默认禁止
(1)提供访问远程MySQL服务器上表的方法
(2)本地不存储数据,数据全部方放在远程服务器上
(3)本地需要保存表结构和远程服务器的连接信息
MySQL配置文件详解:http://www.jb51.net/article/48082.htm
基准测试:优化:
1、sql语句优化。select *,NOT NULL之类的 少用 http://www.cnblogs.com/zengxiangzhan/archive/2009/12/04/1617186.html
2、建立索引。
索引优化: http://www.jb51.net/article/76702.htm
(1)索引列上不能使用表达式或函数
(2)联合索引,经常被使用的列优先,选择性高的列优先,宽度小的列优先
(3)覆盖索引,可以优化缓存,减少磁盘IO操作,可以减少随机IO,随机IO操作变为顺序IO操作,可以避免对InnoDB主键索引的二次查询
(4)使用索引扫描来优化排序
3、分库分表,MyCat中间件(少用大表),大表历史数据的归档
4、处理大事务:(1)避免处理太多数据,(2)移出事物中不必要的select操作
5、数据库参数优化。
6、数据库表结构优化。