mysql数据库可靠性分析
mysql数据库有undo空间
5种mysql做可靠性分析的方案:
1.MySQL Clustering(ndb-cluster stogare)
简介:
MySQL公司以存储引擎方式提供的高可靠性方案,是事务安全的,实时复制数据,可用于需要高可靠性及负载均衡的场合。该方案至少需要三个节点服务器才能达到较好的效果。
成本:
节点服务器对RAM的需求很大,与数据库大小呈线性比例;
最好使用千兆以太网络;
还需要使用Dolphin公司提供的昂贵的SCI卡。
优点:
可用于负载均衡场合;
可用于高可靠性场合;
高伸缩性;
真正的数据库冗余;
容易维护。
缺点:
随着数据库的变大,对RAM的需求变得更大,因此成本很高;
速度:
几乎 比典型的单独服务器(无千兆以太网,无SCI卡,存储引擎相关的限制少)慢10倍。
应用场合:
冗余,高可靠性,负载均衡
2. MySQL / GFS-GNBD/ HA (Active/Passive)
简介:
如果多个MySQL服务器使用共享硬盘作为数据存储,此方案如何?
GFS/GNBD可以提供所需的共享硬盘。
GFS是事务安全的文件系统。同一时刻你可以让一个MySQL使用共享数据。
成本:
最多n台高性能服务器的成本,其中一个激活的,其他作为备份服务器。
优点:
高可靠性
某种程度的冗余
按照高可靠性进行伸缩
缺点:
没有负载均衡
没有保证的冗余
无法对写操作进行伸缩
速度:
单独服务器的2倍。对读操作支持得较好。
应用场合:
需要高可靠性的、读操作密集型的应用
3. MySQL / DRBD / HA (Active/Passive)
简介:
如果多个MySQL服务器使用共享硬盘作为数据存储,此方案如何?
DRBD可以提供这样的共享硬盘。DRBD可以被设置成事务安全的。
同一时刻你可以让一个MySQL使用共享数据。
成本:
最多n台高性能服务器的成本,其中一个激活的,而其他则作为备份服务器。
优点:
高可靠性;
一定程度的冗余;
以高可靠性名义来看是可伸缩的。
缺点:
没有负载均衡
没有保证的冗余
在写负载方面没有伸缩性
速度:
在读写方面相当于单独服务器
应用场合
需要高可靠性、读操作密集型的应用
4. MySQL Write Master / Multiple MySQL Read Slaves (Active/Active)
简介:
考虑不同的读、写DB数据库连接的情况。可以使用一台主服务器用于写操作,而采用n台从服务器用于读操作。
成本:
最多1台高性能写服务器,n台读服务器的成本
优点:
读操作的高可靠性;
读操作的负载均衡;
在读操作负载均衡方面是可伸缩的。
缺点:
无写操作的高可靠性;
无写操作的负载均衡;
在写操作方面无伸缩性;
速度:
同单独服务器;在读操作方面支持得较好
应用场合
读操作密集型的、需要高可靠性和负载均衡的应用。
5. Standalone MySQL Servers(Functionally separated) (Active)
多台功能分离的单独服务器,没有高可靠性、负载均衡能力,明显缺点太多,不予考虑。
mysql数据库如何优化,优化了哪些功能
mysql的优化大的有两方面:
1、配置优化
配置的优化其实包含两个方面的:操作系统内核的优化和mysql配置文件的优化
1)系统内核的优化对专用的mysql服务器来说,无非是内存实用、连接数、超时处理、TCP处理等方面的优化,根据自己的硬件配置来进行优化,这里不多讲;
2)mysql配置的优化,一般来说包含:IO处理的常用参数、最大连接数设置、缓存使用参数的设置、慢日志的参数的设置、innodb相关参数的设置等,如果有主从关系在设置主从同步的相关参数即可,网上的相关配置文件很多,大同小异,常用的设置大多修改这些差不多就够用了。
2、sql语句的优化
1、 尽量稍作计算
Mysql的作用是用来存取数据的,不是做计算的,做计算的话可以用其他方法去实现,mysql做计算是很耗资源的。
2.尽量少 join
MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL 优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在 Join 这方面所下的功夫还不够,所以性能表现离 Oracle 等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。
3.尽量少排序
排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的响应时间。
对于MySQL来说,减少排序有多种办法,比如:
通过利用索引来排序的方式进行优化
减少参与排序的记录条数
非必要不对数据进行排序
【原】mysql的for update优化心得
一个消息表,需要被多个节点抓取,存在并发的情况,要求节点抓取的数据不能重复。
结论:可以解决需求,但会导致表锁,原因是for update只有在限制主键ID时,才会采用行锁,否则会采用表锁。所以要使用for update,必须限制查询表的主键ID。
结论:不能解决问题,且会造成 DEPENDENT SUBQUERY ,从而导致慢查询。原因是子查询的查询次数依赖于外层查询,当外查询数据过多时,会严重影响查询性能。
结论:不会造成慢查询,但会造成数据重复抓取。原因是临时表的查询没有采用 for update ,依然可以读取到正在修改的数据,所以当有并发请求时,可能会取到已被修改过的数据,造成脏读。
结论:能满足需求,且在百万级数据下仍然做到毫秒级查询(当然也跟机器配置有关)。
希望能帮到有需要的人。
6条比较有用的MySQL数据库操作的SQL语句小结
在MySQL数据库操作中,我们常常编写一些SQL语句来实现自己想要的功能。但是对于初学MySQL数据库的人来说这似乎又有一定的难度。本文我们总结了六条比较有用的SQL语句,初学者可以套用下面的格式,接下来就让我们一起来了解一下这部分内容。
1.计算年数
如果您想通过生日来计算这个人的年龄,可以用以下的语句来实现:
SELECT
DATE_FORMAT(FROM_DAYS(TO_DAYS(now())
-
TO_DAYS(@dateofbirth)),
\'%Y\')
+
0;
2.两个时间的差
取得两个
datetime
值的差。假设
dt1
和
dt2
是
datetime
类型,其格式为
‘yyyy-mm-dd
hh:mm:ss\',那么它们之间所差的秒数为:UNIX_TIMESTAMP(
dt2
)
-
UNIX_TIMESTAMP(
dt1
)
除以60就是所差的分钟数,除以3600就是所差的小时数,再除以24就是所差的天数。
3.显示某一列出现过N次的值
SELECT
id
FROM
tbl
GROUP
BY
id
HAVING
COUNT(*)
=
N;
4.计算两个日子间的工作日
所谓工作日就是除出周六周日和节假日。
SELECT
COUNT(*)
FROM
calendar
WHERE
d
BETWEEN
Start
AND
Stop
AND
DAYOFWEEK(d)
NOT
IN(1,7)
AND
holiday=0;
5.查找表中的主键
SELECT
k.column_name
FROM
information_schema.table_constraints
t
JOIN
information_schema.key_column_usage
k
USING
(constraint_name,table_schema,table_name)
WHERE
t.constraint_type=\'PRIMARY
KEY\'
AND
t.table_schema=\'db\'
AND
t.table_name=tbl\'
6.查看你的数库有多大
SELECT
table_schema
AS
\'Db
Name\',
Round(
Sum(
data_length
+
index_length
)
/
1024
/
1024,
3
)
AS
\'Db
Size
(MB)\',
Round(
Sum(
data_free
)
/
1024
/
1024,
3
)
AS
\'Free
Space
(MB)\'
FROM
information_schema.tables
GROUP
BY
table_schema
;
关于MySQL数据库的比较有用的SQL语句的介绍就到这里了.