Aug 07, 2018
创建数据库
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
创建表?
CREATE TABLE table_name (
field_name type is_null default options,
...
PRIMAR KEY (id),
INDEX/KEY index_name (field_name),
) ENGINE=InnoDB;
// 注意:KEY is normally a synonym for INDEX
设定 auto_increment
注意 …
Jul 24, 2018
1. 拆分影响很多行的语句
对于 delete update insert 等语句一定要使用 limit 子句限制影响的行数,避免一次更改特别多的行,造成数据库假死
while (1) {
//每次只做1000条
mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");
if (mysql_affected_rows() == 0) {
// 没得可删了,退出!
break;
}
// 每次都要休息一会儿
usleep(50000);
}
2. 垂直分割
把不会用作索引的,或者是过长的字段可以考虑使用其他存储引擎,比如 rocksdb 等。
3. IPv4 地址可以存为 uint32
使用 uint32 存储 IP 地址不光可以节省空间,而且可以按区间查询。
4 …
Jul 23, 2018
Mysql 中默认的 wait_timeout 和 interactive_timeout 的值是八小时,也就是一个连接(交互式和非交互式的)只有在 8 小时没有活动之后才会被关闭掉。对于互联网公司来说,这个值实在太大了,一个库可能被很多脚本和服务访问,可能只是一个简短的查询就不需要数据库了,如果每个查询都占据了8小时的时间,那么 mysql 很快连接数就会满了,报出 too many connections 错误。
mysql 默认的连接数可以修改 max_connections 参数,但是一个服务器能支撑的连接数显然是由硬件决定的。
设置 wait_timeout 过短可能会造成一些问题,如果在 django 中两次查询的之间时间大于 wait_timeout,就会报 (2006, 'MySQL server has gone away')。django 官方给的建议是:
- 当你的脚本不需要使用数据库的时候,主动关闭连接
from django.db …
Jul 20, 2018
主要参考这篇文章:https://mp.weixin.qq.com/s/vS8IMgBIrfGpZYNUwtXrPQ
1. 集合操作避免范围过大
使用 sortedset、set、list、hash等集合类的O(N)操作时要评估当前元素个数的规模以及将来的增长规模,对于短期就可能变为大集合的key,要预估O(N)操作的元素数量,避免全量操作,可以使用HSCAN、SSCAN、ZSCAN进行渐进操作。集合元素数量过大在使用过程中会影响redis的实际性能,元素个数建议尽量不要超过5000,元素数量过大可考虑拆分成多个key进行处理。
2. 合理使用过期时间
如果key没有设置超时时间,会导致一直占用内存。对于可以预估使用生命周期的key应当设置合理的过期时间或在最后一次操作时进行清理,避免垃圾数据残留redis。redis 不是垃圾桶。
3. 利用批量操作命令
假设要给一个集合导入 5000 个元素:
方案1:直接使用redis的HSET逐个设置
for _ in 0..5000
HSET hash …
Jul 16, 2018
我们知道在 redis 中可以给每个 key 设置过期时间(TTL),但是没法为每个集合中的每一个元素设置过期时间,可以使用zset来实现这个效果。
直接上代码吧,Python 版的。
class RedisSet:
def __init__(self, key):
self.client = redis.StrictRedis()
self.key = key
def add(self, val, ttl=60):
now = time.time()
# 把过期时间作为 score 添加到 zset 中
self.client.zadd(self.key, now + ttl, val)
# 删除已经过期的元素
self.client.zremrangebyscore …
Jun 18, 2018
mysql 有三种主从复制方式
MySQL传统的高可用解决方案是通过binlog复制来搭建主从或一主多从的数据库集群。主从之间的复制模式支持异步模式(async replication)和半同步模式(semi-sync replication)。无论哪种模式下,都是主库master提供读写事务的能力,而slave只能提供只读事务的能力。在master上执行的更新事务通过binlog复制的方式传送给slave,slave收到后将事务先写入relay log,然后重放事务,即在slave上重新执行一次事务,从而达到主从机事务一致的效果。
其他文档:
http://mysql.taobao.org/monthly/2017/08/01/
http://blog.csdn.net/d6619309/article/details/53691352
http://blog.51cto.com/wangwei007/1893703
https://www.digitalocean.com/community/tutorials/how-to-configure-mysql-group-replication-on-ubuntu-16-04
http://blog …
May 20, 2018
在前公司的时候,大家习惯在每个表加一个 extra 字段来表示一些额外的字段,然后在 ORM 中使用的时候再解析出来,方便了扩展字段,但是缺点也很明显,extra 字段只能读取而无法进行查询。MySQL 5.7 终于支持了 json 字段,相当于加入了一些 NoSQL 的特性,这样就可以很方便得查询了。
json 字段的使用
建表:
CREATE TABLE `book` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) NOT NULL,
`tags` json DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
直接使用 json …
Apr 11, 2018
看到网上有篇文章用韦恩图来讲解了一下 SQL 的 join 操作,但是感觉举的例子似乎不太实际,遂自己写了一篇,图是从那篇文章里面盗的(逃
假设我们有下面两张表,上边的是表 user,下边的是 package,表示每个用户对应的包裹
id |
name |
1 |
Luke |
2 |
Leia |
3 |
Anakin |
4 |
Padem |
id |
content |
user_id |
1 |
droid |
3 |
2 |
lightsaber |
2 |
3 |
blaster |
1 |
4 |
R2D2 |
5 |
创建这两个表的语句分别是:
create table user (id integer, name string …
Apr 09, 2018
Group by
用来按照某一列或者某几列的值聚合数据。group by x
按照 x 相同的值聚合,group by x, y
按照 x 和 y 都相同的值聚合。而查询的列要么是聚合的列,要么应该通过聚合函数来选取一列。而且所有的 null 会被聚合成一行
比如说下面的数据表中
-- How many countries are in each continent?
select
continent
, count(*)
from
countries
group by
continent
执行查询可以得到每个洲的国家的数量。
过滤
在 SQL 中,Where 子句是在 group 子句之前运行的,所以我们无法通过 where …
Apr 08, 2018
太多的程序员认为SQL像是洪水猛兽一样。它是少有的几种声明式的语言,和其他的命令似的面向对象的甚至函数使得语言大相径庭。
我每天都会写SQL而且在我的开源项目中大量的使用SQL,因此我非常地想要把SQL的美展现给你们这些还在挣扎着使用它的渣渣们。下面的教程适合
- 使用过SQL但是从来没有完全理解他的人
- 很了解SQL,但是从来没有思考过他的语法的人
- 想要把SQL交给其他人的人
这个教程将会这关注SELECT语句,其他的DML将会在另一篇文章中介绍
SQL是声明式的
首先要记住,声明式。唯一的一种范式就是你可以只是声明你想要的结果就得到了他。而不是告诉你的电脑怎样去把这个结果计算出来,不错吧?
Select first_name, last_name FROM employees WHERE salary > 100000
很简单,你不需要关心employee的记录是存在哪里的,你只想要知道那些薪水还不错的人。
如此简单,那么问题在哪里呢?问题在于我们大部分时候是在按照命令式的编程思维在思考,比如“机器,干这个,然后干那个,但是在这之前检查一下,如果是这样或者那样就不行”。这其中包括了存储临时结果在变量里,循环,迭代,调用函数等等。
忘掉那些东西,思考如何声明东西,而不是告诉机器怎样去计算。
SQL语法的顺序有些问题
常见的混乱的来源可能是SQL语法并不是按他们的执行顺序来排序的,词法(Lexical …