数据库水平切分方法

    在大中型项目中,在数据库设计的时候,考虑到数据库最大承受数据量,通常会把数据库或者数据表水平切分,以降低单个库,单个表的压力。


    我这里介绍两个我们项目中常用的数据表切分方法。当然这些方法都是在程序中使用一定的技巧来路由到具体的表的。首先我们要确认根据什么来水平切分?在我们的系统(SNS)中,用户的UID贯穿系统,唯一自增长,根据这个字段分表,再好不过。


方法一:使用MD5哈希

做法是对UID进行md5加密,然后取前几位(我们这里取前两位),然后就可以将不同的UID哈希到不同的用户表(user_xx)中了。

1.png

通过这个技巧,我们可以将不同的UID分散到256中用户表中,分别是user_00,user_01 …… user_ff。因为UID是数字且递增,根据md5的算法,可以将用户数据几乎很均匀的分别到不同的user表中。


但是这里有个问题是,如果我们的系统的用户越来越多,势必单张表的数据量越来越大,而且根据这种算法无法扩展表,这又会回到文章开头出现的问题了。

- 阅读全文 -

mysql 远程连接速度慢的解决方案

    之前我在vps安装mysql之后,开启mysql外连,用本机连接远程mysql特别卡,在服务器上连接不卡,当时没有解决,以为是远程卡,后来想了一下服务器是阿里云的也不该那么卡呀,连接都要5秒钟左右,网上查到了资料,出现这种问题的主要原因是,默认安装的MYSQL开启了DNS的反向解析。

    解决方案:在my.ini(WINDOWS系统下)或my.cnf(UNIX或LINUX系统下)文件的[mysqld]下加入skip- name-resolve这一句。

[mysqld]
skip-name-resolve


重启mysql服务,远程连接速度正常。

注意:到这里还没完呢,mysql.user 表里面的 host 不要用 localhost 之类的,要用127.0.0.1不然都连不上数据库,会报错,% 的不影响。代码里面的config文件记得改成127.0.0.1。

MySQL 5.6内存占用过高解决方案

 由于VPS仅有1GB内存,在开启常用的Web服务之后,无力再为MySQL提供400MB以上的物理内存。

 在cmd下sc qc mysql56  找到my.ini的路径。

 修改参数: 

 table_definition_cache=400

 table_open_cache=256


保存之后重新启动MySQL服务,其内存占用即可从400MB以上降低至60MB左右。

调整之后性能会有所下降,我在内网服务器调整之后,很明显远程连mysql打开速度明显慢。内存足够的情况下不需要调整。


调整之前

调整之后


Windows下mysql忘记root密码的解决方法

1、 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令:

net stop mysql 

如果拒绝方法就到服务里面结束掉。

打开第一个cmd窗口,切换到mysqlbin目录,运行命令:

mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.1\my.ini" --console --skip-grant-tables

C:\Program Files\MySQL\MySQL Server 5.1\my.ini  这个my.ini  路径换成自己的

注释:

该命令通过跳过权限安全检查,开启mysql服务,这样连接mysql时,可以不用输入用户密码。 

- 阅读全文 -

好友关系数据表设计

商城网站需要自己维护好友关系,从知乎看到的思路,记录一下。


数据表三个字段
    主键(自动生成)
    UserID1
    UserID2

注意事项
    <UserID 1, UserID 2> 和 <UserID 2, UserID 1> 是一样的记录,不要重复添加
    为了快速判断两个人是不是好友,可以在程序层插入数据前加一个限制 UserID1 < UserID2
    为了快速得到一个人的好友列表,查询时用 UNION ALL,不是 UNION
    如果为了再高效,加入缓存层(Redis 或 Memcached)