未来往事
学会感谢你身边的一切、感谢你身边的每一个人,善待他人,即是最好的善待自己。 [2017年 第42周/共52周]

mongodb与mysql优缺点比较

mongodb与mysql优缺点比较,与关系型数据库相比,MongoDB的优点:
①弱一致性(最终一致),更能保证用户的访问速度:
举例来说,在 传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值。这在某些情况下,例如通过ATM查看账户信息的 时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延迟。他们需要的是一个“大约” 的数字以及更快的处理速度。
但某些情况下MongoDB会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用 了下面的优化方式来避免锁定:每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/从部署方案中,从节点可以使用 “-pretouch”参数运行,这也可以得到相同的效果。使用多个mongod进程。我们根据访问模式将数据库拆分成多个进程。

②文档结构的存储方式,能够更便捷的获取数据。
对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难。

③内置GridFS,支持大容量的存储。
GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。

④内置Sharding。
+阅读全文

mysql replace

mysql replace,mysql replace替换,mysql替换,mysql substring,mysql locate

语法格式:

UPDATE 表名
SET 字段名 = REPLACE (
替换前的字段值,
‘替换前关键字’,
‘替换后关键字’
)
WHERE
字段名 REGEXP “替换前的字段值”;

示例Demo:
(1)替换b-blog表主键id为9的content字段内容www.fity.cn为fity.cn:

  1. UPDATE b_blog
  2. SET content








......
+阅读全文

sql查询过滤手机号码数据 mysql

mysql查询为手机号码的数据

  1. select * from basic_user_info where mobilephone is not null and
......
+阅读全文

MySQL bin-log日志及expire-logs-days参数详解

MySQL bin-log功能,bin-log清理及expire-logs-days参数详解

今天突然发现博客不能访问了,登录vps后发现磁盘/根目录可用空间为0:
root@antphp:/:# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/MyDebianVPS-root
                      9.3G  8.8G   0    100% /
tmpfs                 504M     0  504M   0% /lib/init/rw
udev                  493M   76K  493M   1% /dev
tmpfs                 504M     0  504M   0% /dev/shm
/dev/xvda1            228M   18M  199M   8% /boot
/dev/xvdb1            9.9G  2.7G  6.7G  29% /opt
来源:未来往事 http://fity.cn
经过排查发现是mysql bin-log占用了几个GB的空间,对于普通vps来说空间本来就几个GB,所以自然而然也就满了。于是本文呢就在这样的情况产生啦 [emot]grin[/emot]

看了上面内容,你可能会疑惑MySQL bin-log功能究竟有何作用?

1:数据恢复:如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据:主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。
简单地说,这些MySQL var目录下的形如mysql-bin.000***的文件是MySQL的事务日志。
PS:缺点是将无法使数据库恢复先前的状态

这里我们查看到mysql-bin log占用了至少大于5GB的空间:
root@antphp:/usr/local/mysql/var# du -sh *
108M    antphp.err
4.0K    antphp.pid
144K    blog@002eyuboya@002ecom
1.1M    mysql
28K     mysql-bin.000001
1.1M    mysql-bin.000002
4.0K    mysql-bin.000003
4.0K    mysql-bin.000004
2.7M    mysql-bin.000005
1.1G    mysql-bin.000006
1.1G    mysql-bin.000007
1.1G    mysql-bin.000008
1.1G    mysql-bin.000009
1.1G    mysql-bin.000010
………………………………
来源:未来往事 http://fity.cn
PS:命令行模式查看:mysql> show binary logs;

MySQL bin-log状态查看/管理

通过查看mysql配置文件我们可以看到该mysql服务的bin-log是开启的状态:
root@antphp:/# cat /etc/my.cnf | grep log-bin
log-bin=mysql-bin
来源:未来往事 http://fity.cn
PS:
1、这一行注释,重启mysql服务即可关闭bin日志的记录
2、命令行模式查看:mysql> show global variables like '%bin%';

MySQL bin-log如何删除清理?

如果没有主从复制,可以通过reset master的方式,重置数据库日志,清除之前的日志文件:
reset master;

但是如果存在复制关系,应当通过PURGE的方式来清理bin日志,语法如下:
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
来源:未来往事 http://fity.cn
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。

例如:
+阅读全文

SQL去重统计

SQL去除重复后并统计所有行语句

  1. SELECT COUNT(distinct parkNum) AS num FROM park_room WHERE `areaId` = 1 AND `status` =
......
+阅读全文

SQL查询重复数据并列出重复数据

SQL按字段查询重复数据并列出重复数据

例如:查询重复2次的数据并列出

  1. select * from park_room where parkNum in (
......
+阅读全文

MySQL查询数据表唯一或相同重复数据记录

MySQL筛选查询数据库唯一数据记录,非重复数据,仅显示唯一的数据:

  1. select parkNum ,count(parkNum) from park_room group by parkNum having count
......
+阅读全文

php获取mysql字段名称及其详细信息

首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句:

  1. SHOW DATABASES //列出 MySQL Server 数据库。
  2. SHOW TABLES [FROM db_name] //列出数据库数据表。
  3. <
......
+阅读全文

MySQL子查询常见格式

MySQL常见的几种子查询形式

mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当的麻烦。mysql子查询的几种常见写法:

  1. select * from xxx where col =
......
+阅读全文

phpMyAdmin隐藏数据库information_schema/mysql

本文收集内容:
phpMyAdmin隐藏多个数据库(information_schema|mysql|test)
phpMyAdmin禁止/不允许用户修改密码

phpMyAdmin隐藏多个数据库 information_schema|mysql|test
编辑/libraries/config.default.php
  1. 隐藏
......
+阅读全文

MySQL HandlerSocket

MySQL HandlerSocket 插件说明与安装配置

一、HandlerSocket是什么?
HandlerSocket是akira higuchi写的一个MySQL的插件。以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释、打开关闭表、创建查询计划等CPU开销。
目前使用MySQL的网站,多半同时使用Memcache作为键值缓存。虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Memcache成为故障的根源:
Memcache数据一致性的问题:当MySQL数据变化后,如果不能及时有效的清理掉过期的数据,就会造成数据不一致。这在强调即时性的Web2.0时代,不可取。
Memcache崩溃后的雪崩效应:作为缓存的Memcache一旦崩溃,MySQL很可能在短时间内承受高负载而宕机。
注:关于清理过期数据的问题,可以在程序架构上想办法,如果数据操作有统一DAO封装的话,可以利用Observer模式来清理过期数据,非主题内容,资料自查。
面对以上问题,HandlerSocket项目是个不错的解决方案,它通过插件的方式赋予MySQL完整的NoSQL功能,从原理上讲,它跳过MySQL中最耗时的语法解析,查询计划等步骤,直接读取数据,如果内存够大,能装下索引,MySQL的查询效率能提高若干倍!
HandlerSocket:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
php-handlersocket:http://code.google.com/p/php-handlersocket/

系统信息约定:
系统版本:CentOS 6.3 X86
PHP安装目录:/usr/local/webserver/php5318
MySQL安装目录:/usr/local/webserver/mysql5520
HandlerSocket安装路径:/usr/local/webserver/handlersocket

二、安装配置HandlerSocket
安装之前建议你先安装相关支持及需要的组件包:
yum install gcc gcc-c++ libtool make openssl-devel perl-DBI perl-DBD-MySQL
yum install rpm-build gperf readline-devel ncurses-devel time perl-Time-HiRes

1. 安装
如果使用Percona Server版本的MySQL就简单了,因为它已经内置了HandlerSocket支持,不过考虑到其内置的版本不够新,存在一些早已修复的BUG,所以最好采用源代码编译。HandlerSocket是基于MySQL数据库的,因此在安装HanderSocket前需要先按照常规方式部署MySQL服务,同时需注意HandlerSocket时需要MySQL的源码,因此还需要MySQL源码编译方式安装。
[root@iredmail opt]# git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
[root@iredmail opt]# cd HandlerSocket-Plugin-for-MySQL
[root@iredmail HandlerSocket-Plugin-for-MySQL]# ./autogen.sh
[root@iredmail HandlerSocket-Plugin-for-MySQL]#./configure --prefix=/usr/local/webserver/handlersocket --with-mysql-source=/opt/mysql-5.5.20 --with-mysql-bindir=/usr/local/webserver/mysql5520/bin --with-mysql-plugindir=/usr/local/webserver/mysql5520/lib/mysql/plugin
Tips:
--with-mysql-source 指定MySQL源码所在目录
--with-mysql-bindir 表示MySQL二进制可执行文件目录
--with-mysql-plugindir 指定MySQL插件的存储路径,如果不清楚这个目录在哪,可以按如下方法查询:
mysql> show variables like 'plugin%';
+---------------+-------------------------------------------+
| Variable_name | Value                                     |
+---------------+-------------------------------------------+
| plugin_dir    | /usr/local/webserver/mysql5520/lib/plugin |
+---------------+-------------------------------------------+
1 row in set (0.00 sec)
[root@iredmail HandlerSocket-Plugin-for-MySQL]# make
常见错误:
libtool: link: only absolute run-paths are allowed
make[2]: *** [handlersocket.la] Error 1
make[2]: Leaving directory `/opt/HandlerSocket-Plugin-for-MySQL/handlersocket'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/opt/HandlerSocket-Plugin-for-MySQL'
make: *** [all] Error 2
解决方法:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# vi handlersocket/Makefile
line 301:
$(handlersocket_la_LINK) -rpath $(pkgplugindir) $(handlersocket_la_OBJECTS) $(handlersocket_la_LIBADD) $(LIBS)
-->
$(handlersocket_la_LINK) -rpath /opt/HandlerSocket-Plugin-for-MySQL/handlersocket $( handlersocket_la_OBJECTS) $(handlersocket_la_LIBADD) $(LIBS)

[root@iredmail HandlerSocket-Plugin-for-MySQL]#make install
完成后,mysql-plugindir目录下应有handlersocket相关文件

2、配置MySQL:
修改my.cnf配置文件:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# vi /etc/my.cnf
[mysqld]
plugin-load=handlersocket.so(plugin-load可略过不配)
loose_handlersocket_port = 9998 # 指定读请求端口号
# the port number to bind to (for read requests)
loose_handlersocket_port_wr = 9999 # 指定写请求端口号
# the port number to bind to (for write requests)
loose_handlersocket_threads = 16 # 指定读线程数目
# the number of worker threads (for read requests)
loose_handlersocket_threads_wr = 1 # 指定写线程数目
# the number of worker threads (for write requests)
open_files_limit = 65535
# to allow handlersocket accept many concurren connections, make open_files_limit as large as possible.
Tips:InnoDB的innodb_buffer_pool_size,或MyISAM的key_buffy_size等关系到缓存索引的选项尽可能设置大一些,这样才能发挥HandlerSocket的潜力。

登陆MySQL并激活HandlerSocket插件:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# mysql -uroot -p
mysql> install plugin handlersocket soname 'handlersocket.so';
ERROR 1126 (HY000): Can't open shared library '/usr/local/webserver/mysql5520/lib/plugin/handlersocket.so' (errno: 2 cannot open shared object file: No such file or directory)
说明:这里提示没有找到handlersocket.so扩展文件,请查看扩展文件是否存在。
mysql> install plugin handlersocket soname 'handlersocket.so';
Query OK, 0 rows affected (0.00 sec)

mysql> quit;
至此,HandlerSocket插件安装完毕。

重启mysql服务:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# service mysqld restart

3、HandlerSocket状态测试:

点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

也可以通过查询刚配置的端口是否已经被MySQL占用来确认是否安装成功:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# lsof -i -P | grep mysqld
mysqld    26871 mysql   11u  IPv4  72467      0t0  TCP *:9998 (LISTEN)
mysqld    26871 mysql   29u  IPv4  72469      0t0  TCP *:9999 (LISTEN)
mysqld    26871 mysql   31u  IPv4  72474      0t0  TCP *:3306 (LISTEN)
Tips:If ports 9998 and 9999 don’t show up.  Make sure SELinux is not running.

三、安装配置 php-handlersocket 扩展模块:
1、安装php-handlersocket扩展
[root@iredmail opt]# wget http://php-handlersocket.googlecode.com/files/php-handlersocket-0.3.1.tar.gz
[root@iredmail opt]# tar -zxvf php-handlersocket-0.3.1.tar.gz
[root@iredmail opt]# cd handlersocket/
[root@iredmail handlersocket]# /usr/local/webserver/php5318/bin/phpize
[root@iredmail handlersocket]# ./configure --with-php-config=/usr/local/webserver/php5318/bin/php-config
./configure可加参数:
点击在新窗口中浏览此图片
Tips:If you get error:
configure: error: Can't find hsclient  headers,please install libhsclient first,Or ./configure--disable-handlersocket-hsclient --with-php-config=/usr/local/webserver/php5318/bin/php-config use native type.
[root@iredmail handlersocket]#make && make install
A successful install will have created handlersocket.so and put it into the PHP extensions directory. You'll need to and adjust php.ini and add an extension=handlersocket.so line before you can use the extension.
[root@iredmail handlersocket]# vi /usr/local/webserver/php5318/etc/php.ini
extension=handlersocket.so

至此php扩展安装完成,放问php.info页面,我们可以看到已经成功加载了handlersocket扩展

点击在新窗口中浏览此图片


2、php-handlersocket 使用示例:
+阅读全文

MySQL触发器代码生成

......
+阅读全文

MySQL数据库存储引擎选择 - 性能优化

MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系。由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景。

MyISAM
特性:
不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用
表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能
读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读
只会缓存索引:MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据

适用场景:
不需要事务支持(不支持)
并发相对较低(锁定机制问题)
数据修改相对较少(阻塞问题)
以读为主
数据一致性要求不是非常高

最佳实践:
尽量索引(缓存机制)
调整读写优先级,根据实际需求确保重要操作更优先
启用延迟插入改善大批量写入性能
尽量顺序操作让insert数据都写入到尾部,减少阻塞
分解大的操作,降低单个操作的阻塞时间
降低并发数,某些高并发场景通过应用来进行排队机制
对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问


InnoDB
特性:
具有较好的事务支持:支持4个事务隔离级别,支持多版本读
行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响
读写阻塞与事务隔离级别相关
具有非常高效的缓存特性:能缓存索引,也能缓存数据
整个表和主键以Cluster方式存储,组成一颗平衡树
所有Secondary Index都会保存主键信息

适用场景:
需要事务支持(具有较好的事务特性)
行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

最佳实践:
主键尽可能小,避免给Secondary index带来过大的空间负担
避免全表扫描,因为会使用表锁
尽可能缓存所有的索引和数据,提高响应速度
在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
避免主键更新,因为这会带来大量的数据移动


NDBCluster
+阅读全文

Discuz!积分同步/多站点用户积分提醒消息数据同步

Discuz多论坛用户积分同步 Discuz多论坛积分同步 Discuz多站点用户信息数据同步
文章已有最新版:http://fity.cn/post/457/
最后更新:2014-02-10 12:08
     关于Discuz积分同步,近期将重新发布一篇新文章介绍在discuzX3中实现discuz用户积分同步。本文bug不在修复。
最后更新:2013-04-23 22:19
     修复了已知bug。如使用,请确定自己对Discuz或mysql服务器有所了解或联系未来往事获取帮助。另外就是目前Discuz已发布X3测试版产品和Discuz的程序版本的生命周期时间,建议你往高版本升级。

录入时间:2013-04-10 23:55
前段时间有几个discuz上面的网友在QQ上问针对discuzX1.5-X2.0多论坛、站点环境下如何同步各个站点的用户相关数据信息(例如:积分、消息、提醒、勋章获得情况等),确保多站点用户数据的一致性,提升用户体验,于是整理了这篇文章。如果要实现这样的结果,很显然需要共用用户数据信息,当然从程序或是服务器方面综合来说实现方法也有很多种。

本文基于Discuz!X2.0版本程序、独立主机(如果为虚拟主机需要修改部分内容)环境所写,阐述的方法是通过Discuz的分布式部署+MySQL触发器实现这一需求。
Discuz在X1.0版本发布以后开始支持在多个数据库之间操作,到X2.0版本可以看到分布式MySQL部署已经有个趋势但依然并不完善、存在诸多的bug。官方的回复是目前X2.0依然不支持分布式部署。不过现在好多站点都已经升级到X2.5版本,X2.5版本官方给出的产品文档中已指出支持分布式MySQL部署,X3.0中官方曝光支持站点热点数据缓存层和数据库分布式部署,在架构、性能、移动互联网方面逐渐增强。

闲话不多说了,下面进入正题:

环境相关信息约定:
Discuz版本:DiscuzX2.0(未集成UCenter Home)
                   UCenter1.6.0(单独的域名:uc.fity.cn)
站点域名:a.fity.cn 和 b.fity.cn(这里我们需要实现这两个站点的用户积分同步)
MySQL版本:5.0.x
数据库相关信息:
    a.fity.cn 使用MySQL数据库:bbs_a
    b.fity.cn 使用MySQL数据库:bbs_b
    积分同步的表存储到公共数据库:memberdata(该库存储用户的信息和积分,第二主库<读写>,部分页面依然读配置文件中定义的db1下的用户表)
补充信息:由上面的介绍,我们知道在Discuz未来新版本中已经对分布式部署有了更好的支持,所以这里我们考虑到未来架构的移植及可扩展性把需要同步的数据表单独存储到一个公共的数据库memberdata中,实现过程简单示意图:
点击在新窗口中浏览此图片


一、暂时对站点进行关闭操作,以确保各数据库暂时不再被写入
  后台——关闭站点

二、额外了解一些基础:Discuz主要性能优化瓶颈表
  • member表
  • Post表
  • Thread表点击数
  • DIY模块数据更新
  • 帖子点评和评分功能的

Discuz!X系统功能丰富,数据表多达200多个,在实际生产环境中对各种功能的深度使用各不一样,导致每个数据表都有可能承受高并发的访问压力,当出现这种情况时,需要将负载大的数据表及其相关数据表单独部署,以增强系统的负载能力。
这里我们先来看下Discuz!X2.5的分布式部署。Discuz!X2.5理论上支持以表为单位的数据库分布式部署,部分无法独立部署的表将与其相关表被合并为最小部署单位。以下图为例:
点击在新窗口中浏览此图片

三、在Discuz!X2.0中配置MySQL数据库分布式部署,这里我们把pre_common_member和pre_common_member_count两张表部署到第二台数据库服务器(公共用户信息数据库),编辑a.fity.cn和b.fity.cn站点的config_global.php配置文件,CONFIG DB配置区域参考如下内容:
代码中暴露了php脚本代码,未能正常显示,请联系未来往事更正文章……


至此,Discuz!X2.0中的MySQL数据库分布式部署几乎完成了。
需要注意:这里我们需要确保`memberdata`库下的表的信息数据是最终数据(最完整的数据),同时同步给a.fity.cn和b.fity.cn各一份(这里可能在同步一份到各个站点,这样公共库memberdata下的pre_common_member和pre_common_member_count两张表的数据和各个论坛库库下的pre_common_member和pre_common_member_count两张表不是重复了吗?分布式还有什么意义?当你部署完成后就知道原因:同为主库,Discuz!X2.0下设计理念是第二服务器上`memberdata`库pre_common_member和pre_common_member_count两张表可读写,但部分页面读取依然会读第一服务器上的数据,这里不再过多赘述。如果可以建议更新到新版本discuz程序或自行修改程序代码进行调整,这里本文重点介绍的是通过MySQL触发器实现各表数据同步。)如果你的站点数据表之间在这里没有同步,后面完成后你可能会遇到如下错误信息:
点击在新窗口中浏览此图片

更多配置信息请至官方阅读“Discuz!X2.5新版架构优化说明——X2.5的新程序架构”:
http://dev.discuz.org/wiki/index.php

四、利用MySQL触发器将`memberdata`库下pre_common_member和pre_common_member_count两张表的数据同步给a.fity.cn和b.fity.cn站点
+阅读全文

MySQL触发器语句代码在线生成-源码(PHP版)

MySQL触发器 触发程序语句代码自动生成源码(PHP版),实现数据同步

点击进入在线编解码工具页面>>>
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
......
+阅读全文