目录

最新文章

Go语言 昨晚

是对C的重大改进,提供了强大的网络编程和并发编程支持,至力于做到快速编译,高效执行,易于开发。没有类和继承,通过interface来实现多态性。轻量级类型系统。

Go语言官网

Ubuntu 前天

Ubuntu 18.04 作为示范机,U盘装机软件 LinuxLive USB Creator

Go标准库 1周前

文章无缩略内容。

redis-cli 1周前

文章无缩略内容。

nginx 1周前

文章无缩略内容。

个人开发 1周前

文章无缩略内容。

概述 1周前

架构文章 1周前

收集的一些集群与架构的文章,慢慢消化。

codeigniter框架 1周前

文章无缩略内容。

索引 1周前

索引的代价

  • 额外的存储空间

  • 插入和修改数据时,还需额外修改索引

适合建索引的场景

  • join 操作操作使用的列

  • where条件中使用的列

  • 需要经常进行范围搜查的列

  • 需要进行排序输出的列

全文索引

只有MySIAM引擎支持全文索引。

避免全表扫描

  • 避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

  • 能用 between 就不要用 in,in 和 not in 会导致全表扫描

  • 用 exists 代替 in 是一个好的选择

mysql sql 1周前

本文是常见的一些SQL语句的笔记。

深入理解SQL 1周前

文章无缩略内容。

数据库设计 1周前

  1. 需求分析

数据自身的特点?

数据之间的关系?

实体是什么?实体与表之间不是一一对应的关系。实体之间的关系(1对1,1对多,多对多)。实体的标识(主健)

实体的记录的增长速度。

时效性:(用户登录 session之类)的数据要按时清理,
增长性: (有些开发人员,喜欢将访问日志存库,这种数据增长是非常快的,必须制定好清理规则)

  1. 逻辑设计

优化 1周前

  • 慢查询日志:里面会记录那些比较慢的日志,可以使用pt-query-digest工具进行分析

  • explain语句:可以分析单条语句的查询效率

  • show profile、show status、show processlist等语句:查询语句执行慢的各种情况以及消息情况或其它

使用show profile:set profiling=1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中
show profile for query 临时表ID:可以查询每条profile临时表中记录花费的时间

使用show status:show status会返回一些计数器,show global status查看服务器级别的所有计数
使用show processlist:观察是否有大量线程处于不正常的状态或者特征
使用explain:分析单条SQL语句

访问数据太多导致查询性能下降
确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
确认MySQL服务器是否在分析大量不必要的数据行

是否在扫描额外的记录
使用explain来进行分析,如果发现查询需要扫描大量的数据但只返回少数的行,可以通过如下技巧去优化:

使用索引覆盖扫描,把所有用的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果
改变数据库和表的结构,修改数据表范式
重写SQL语句,让优化器可以以更优的方式执行查询

避免使用如下SQL语句
1、查询不需要的记录:使用limit解决
2、多表关联返回全部列:指定A.id,A.name,B.age
3、总是取出全部列:SELECT*会让优化器无法完成索引覆盖扫描的优化
4、重复查询相同的数据,可以缓存数据,下次直接读取缓存

切分查询:将一个大的查询分为多个小的相同的查询:一次性删除1000万的数据要比一次删除1万,暂停一会的方案更加损耗服务器开销
分解关联查询:可以将一条关联语句分解成多条SQL来执行

分解关联查询
可以将一条关联语句分解成多条SQL来执行
让缓存的效率更高
执行单个查询可以减少锁的竞争
在应用层做关联可以更容易对数据库进行拆分

查询效率会有大幅提升
较少冗余记录的查询

内部查询快,和客户端交互慢:MySQL内部每秒能扫描内存中上百万行数据,相比之下,响应数据给客户端就要慢得多
多个简单查询有必要:使用尽可能少的查询是好的,但是有时将一个大的查询分解为多个小的查询是很有必要的

优化count(*)查询
count()中的会忽略所有的列,直接统计所有列数,因此不要使用count(列名)
MyISAM中,没有任何WHERE条件的count(*)非常快;当有WHERE条件,MyISAM的count统计不一定比其他表引擎快

可以使用explain查询近似值,用近似值替代count(*)
增加汇总表
使用缓存

优化关联查询
确定ON或者USING子句的列上有索引
确保GROUP BY和ORDER BY中只有一个表中的列,这样MySQL才有可能使用索引

优化子查询
尽可能使用关联查询来替代

优化GROUP BY和DISTINCT
这两种查询均可使用索引来优化,是最有效的优化方法
关联查询中,使用标识列进行分组的效率会更高
如果不需要ORDER BY,进行GROUP BY时使用ORDER BY NULL,MySQL不会再进行文件排序
WITH ROLLUP超级聚合,可以挪到应用程序处理

优化LIMIT分页
LIMIT偏移量大的时候,查询效率较低,可以记录上次查询的最大ID,下次查询时直接根据该ID来查询

优化UNION查询
UNION ALL的效率高于UNION

分区的话对用户是透明的

对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件
比如age10-25的放到第一个分区:创建表时使用partition by子句定义每个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询只需要查询所需数据在的分区即可
较粗的粒度分在不同的表中:分区的主要目的是将数据按照一个较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且如果想一次性删除整个分区的数据也很方便

1.表大或热点数据:表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据
2.分区独立操作:分区表的数据更易维护,可以对独立的分区进行独立的操作,可以备份和恢复独立的分区
3.不同机器:分区表的数据可以分布在不同的机器上,从而高效使用资源
4.避免瓶颈:可以使用分区表来避免某些特殊的瓶颈

1、1024分区:一个表最多只能有1024个分区
2、不同版本不同限制:5.1版本中,分区表表达式必须是整数,5.5可以使用列分区
3、包含主键和唯一索引列:分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
4、修改表结构:需要对现有表的结构进行修改

1、1024分区:一个表最多只能有1024个分区
2、不同版本不同限制:5.1版本中,分区表表达式必须是整数,5.5可以使用列分区
3、包含主键和唯一索引列:分区字段中如果有主键和唯一索引列,那么主键列和唯一列都必须包含进来
4、无法使用外键约束:分区表中无法使用外键约束
5、修改表结构:需要对现有表的结构进行修改
6.所有分区都必须使用相同的存储引擎
7.分区函数中可以使用的函数和表达式会有一些限制
8.某些存储引擎不支持分区
9.对于MyISAM的分区表,不能使用load index into cache
10.对于MyISAM表,使用分区表时需要打开更多的文件描述符

分库分表的话需要程序员做点事情,主从数据库同步的话借助的是二进制日志

水平分割:表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度

给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作把不同行的数据弄到一起,也可以通过 Redis 维护索引来解决这个问题。

垂直分表:把主键和一些列放在一个表,然后把主键和另外的列放在另一个表。包含主键id:分的不同的表都是用主键id相连,所以都包含主键id。需要join是把不同列的数据弄到一起

应用层逻辑算法:有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差
开发成本:对于应用层来说,逻辑算法无疑增加开发成本

主从复制原理:

1、二进制日志:在主库上把数据更改记录到二进制日志
2、中继日志:从库将主库的日志复制到自己的中继日志
3、读中继日志:从库读取中继日志中的事件,将其重放到从库数据中

解决的问题:

数据分布:随意停止或开始复制,并在不同地理位置分布数据备份
负载均衡:降低单个服务器的压力
高可用和故障切换:帮助应用程序避免单点失败
升级测试:可以使用更高版本的MySQL作为从库

SQL查询的安全方案?

1.使用预处理语句防SQL注入,预处理防sql注入:PHP端尽量使用PDO对数据库进行相关操作,PDO拥有对预处理语句很好的支持的方法,MySQLi也有,但是可扩展性不如PDO,效率略高于PDO,
2.写入数据库的数据要进行特殊字符的转义
3.查询错误信息不要返回给用户,将错误记录到日志

安全设置:

1.定期做数据备份
2.不给查询用户root权限,合理分配权限
3.关闭远程访问数据库权限
4.修改root口令,不用默认口令,使用较复杂的口令
5.删除多余的用户
6.改变root用户的名称
7.限制一般用户浏览其他库
8.限制用户对数据文件的访问权限

无限级分类的实现:

SQL注入攻击与防御 1周前

本文是《SQL注入攻击与防御》一书的笔记。

MySQL或Maria DB 管理 1周前

文章无缩略内容。

让面向对象更加灵活 1周前

  • 组合比继承提供更多的灵活性

  • 将一组对象组合为单个对象

  • 对于客户端代码来说,组合内部是透明的

面向对象 1周前

  • 就是 属性都是各个 对象私有的,各不干扰

  • 父类定义的静态属性会被子类继承,而定义了静态属性的类所产生的对象,它们之间是共享静态属性的

Yii2 1周前

$sql = 'select * from user where id =:id'; 使用占位符的sql语句

User::findBySql($sql,array(":id"=>$id))->all() 通过sql语句查询 ,访问结果为[对象,对象]

User::find()->where(['id'=>1])->all(); 查询 id = 1 的记录

User::find()->where(['>','id',0])->asArray()->all(); 查询 id > 0 的记录,查询结果转化为数组

User::find()->where(['between','id',1,3])->all(); 查询 1 和 3 之间的

User::find()->where(['like','title','abc'])->all(); title like '%abc%' ,百分号自动加上

where 更多表达: yii/db/Query :: where() 方法 查询文档!

批量查询
要处理1000条数据,一下子拿1000条数据入内存太不可取了,使用批量查询,每次只拿100条依次处理,拿完为止,这是有效降低内存使用的方法!每次拿100条存入临时变量tests中处理,处理tests;

文本处理 1周前

  1. find 查找出需要处理的所有文件,

  2. cat 将所有文件拼接,成为起始的stdin

  3. grepstdin流里过滤出,自己想要的行

  4. sedstdin流进行 字符串替换,tr 对流进行单个字符式的替换、去重、删除

  5. cutstdin中每一行,切出指定列,awk 也是切出指定多个列,还是可编程命令

  6. sort对所有行排序,排序好后,可以用uniq -c去除相同的行,再sort -nr到序输出

  7. wc -l统计下行数,或者sed '100,$d' 只取前100行

awk 2周前

  • awk -F regexp '/pattern/{ action }' files

  • awk -F regexp '(expression){ action }' files

  • awk -F regexp -f awk脚本 files

  • -F 设置字段分割符(默认空格tab换行),它接受一个正则表达式re作为值

  • pattern 行匹配模式,省略的话就是匹配所有行

  • { action } 输出模式,省略的话就是输出整行

phpmyadmin 2周前

平时使用phpMyAdmin的一些技巧积累。

php的安装与使用场景 2周前

文章无缩略内容。

PHP语言 2周前

文章无缩略内容。

link 2周前

文章无缩略内容。

正则表达式 2周前

我对于正则表达式的理解,正则表达式是文本之间的游戏。

SHELL 2周前

我掌握的SHELL相关知识和技巧。

SHELL的操作对象是 文件文本行:执行程序,查找文件,删除文件,批量改变文件名,备份文件、列出目录的文件。

awk 可作为 SHELL 操作 文本列 的补充,更细一个粒度。

SHELL中的调用命令分类:

  • 内建命令 : 不会产生子进程,为了效率才内建,比如cd read echo

  • 函数 : 函数可以直接作为命令一样使用

  • 外部命令 : 在PATH里搜寻并且执行的命令,产生子进程

SHELL 脚本的执行被设计为阻塞式的,从上到下,依次执行,遇见创建子进程的外部命令,一定会等待子进程返回后,才继续往下执行。所有命令返回 0 表示执行成功。

codekissyoung 2周前

状态 :离职 / 24岁 / 男
联系 :1802765xxxx / 116209xxxx@qq.com
学历 :2016届本科 / 中国地质大学(北京) / 地质学遥感方向
博客 :blog.codekissyoung.com
代码 :github.com/codekissyoung

服务端架构整理 2周前

  • 一个大型的网络游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须)。其中业务逻辑可能根据具体需要,又划分为好几个子模块。

  • 这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装。

书籍推荐 2周前

平常了解到的一些好书,如果有机会一定要收集下。

2.程序组织结构 2周前

  • Java是面向对象的程序设计语言,其基本语法和C语言大致相同。

  • 从一定角度上讲,C语言加上面向对象功能就是C++。那么Java与C++有什么区别呢?

    1. Java去掉了C语言的指针。如指针使用得当,对增强程序的功能有很大帮助,一旦使用不当,经常会导致死机。

    2. Java没有了C语言中的预处理器。如#ifdef、#define、常量声明等都不使用了,当然也少了#include命令,从而也没有头文件(.h文件)。和C++相比,Java不支
      多继承的概念,目的是为了避免对象和对象之间的关系复杂化。

    3. Java增加了垃圾回收机制、异常处理和新的限定词等功能。这些几乎全部都是基于整个系统和程序本身安全性的考虑。

    4. 不论在何种平台上,Java基本数据类型的大小是不变的。

  • Java的程序结构

    1. 一个Java应用包含一个或多个Java源文件,每个Java源文件只能包含如下内容(空格或注释除外):

    2. 0个或1个包声明语句(Package Statement)

    3. 0个或多个包引入语句(Import Statement)

    4. 0个或多个类的声明(Class Declaration)

    5. 0个或多个接口声明(Interface Declaration)

    6. 每个java源文件可包含多个类或接口的定义,但是至多只有一个类或者接口是public的,而且Java源文件必须以其中public类型的类的名字命名。

  • Java程序主要分为两类:

    1. Java小程序(applet):这类程序嵌入在WWW的页面中,作为页面的组成部分被下载,并且能运行在实现Java虚拟机的web浏览器中,它没有main()函数

    2. Java应用程序(application):单独的窗口应用,一定要有main()主程序

大话数据结构 2周前

本文是《大话数据结构》的笔记。

字符串 2周前

文章无缩略内容。

红黑树 2周前

文章无缩略内容。

散列 2周前

散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。

跳表 2周前

文章无缩略内容。

排序 2周前

常见排序的一些最优写法的收集。

单链表 3周前

本文是单链表这种数据结构的总结。

有品位的C代码 3周前

C 固然是我喜欢的语言,但是它的灵活性,导致可以使用它写出各种难以理解的代码(个人觉得是糟粕),导致代码的可读性不好、还伴有难以发现的 BUG 。使用一门语言,并不需要理解和使用它的全部,聪明的人都会挑选出它的一个子集作为自己的心头所爱。本文所写的就是我自己的心头所爱。

设计模式 3周前

  • 使用函数或者类方法生成对象,而不是在代码中直接 new !

  • 使用工厂模式的一个考虑就是,假如在系统中多次使用了这个类new对象,如果该类发生改变,那么所有new代码都需要改正,但是如果把new这一操作封装到工厂方法里,就只需要改工厂里new的代码就行了,所有使用到该对象(调用工厂方法获得的对象)的地方都不用改

php变量 3周前

给定一个变量 $a ,下列是它的所有情况

  1. $a 未定义过

  2. $a = null

  3. $a 为空值,即 "" ,'' , 0 , 0.00 , "0" , '0' , []

  4. $a 为空对象,即 class A{}; $a = new A();

  5. $a 为非空值

对于判断函数 :

  • isset 判断 3 4 5 都为true

  • empty 判断 1 2 3 都为true

  • if 判断 4 5 为true

PHP会话控制 3周前

文章无缩略内容。

淘宝十年 3周前

文章无缩略内容。

线程 3周前

记录自己所学的所有有关于线程的知识。

linux系统编程 3周前

Linux系统编程笔记。

进程 3周前

记录自己所学的关于进程的所有知识。

现代操作系统 3周前

本文是《现代操作系统》第4版的笔记。

高性能服务器编程 3周前

本文是《Linux高性能服务器编程》一书的编程笔记。

cmake 2019年11月30日

本文记录了cmake的用法。

LInux下C程序开发 2019年10月31日

本文记录我在 Linux 下开发 C 程序用到的知识。

从汇编看C语言 2019年10月31日

高效使用vim 2019年10月31日

Linux的使用 2019年10月31日

Linux系统原理 2019年10月31日

分布式网站 2019年10月31日

Unix_linux编程实践教程 2019年10月31日

操作系统概念 2019年10月31日

函数api参考 2019年10月31日

反射API 2019年10月31日

计算机网络基础知识总结 2019年10月31日

Make构建工具 2019年10月31日

C速记卡片 2019年10月31日

C可变参数函数原理 2019年10月31日

预处理器 2019年10月31日

Linux下64位汇编语言 2019年10月31日

Schemer语言 2019年10月31日

C小程序 2019年10月31日

字符编码 2019年10月31日

运行环境 2019年10月31日

C开发环境 2019年10月31日

汇编语言 2019年10月31日

汇编语言Linux 2019年10月31日

汇编语言x86 2019年10月31日

CSAPP 2019年10月31日

GDB调试器 2019年10月31日

判断文件编码格式 2019年9月30日

给产品经理讲技术 2019年8月31日

编码 2019年8月31日

VSCode 2019年7月31日

Git工作流程 2019年7月31日

composer 2019年7月31日

补码 2019年6月30日

微软c编程 2019年6月30日

AutoTools 2019年6月30日

深入理解构建系统 2019年6月30日

GCC编译特性 2019年6月30日

程序员的思维修炼 2019年6月30日

AcceleratedC++ 2019年5月31日

C++PrimerPlus 2019年5月31日

Apache 2019年5月31日

ab并发测试工具 2019年5月31日

docker 2019年5月31日

git 2019年5月31日

memcache 2019年5月31日

ssh 2019年5月31日

tmux 2019年5月31日

Code-review 2019年5月31日

编程修养 2019年5月31日

Game Server 2019年5月31日

STL源码剖析 2019年5月31日

C++Primer 2019年5月31日

C++语言导学 2019年5月31日

MySQL技术内幕 2019年5月31日

C++TemplateMeta 2019年5月31日

C++概述 2019年5月31日

C++程序设计语言 2019年5月31日

C++编程思想卷一 2019年5月31日

C++编程思想卷二 2019年5月31日

ModernC++Design 2019年5月31日

EffectiveC++ 2019年5月31日

Clion 2019年5月31日

TcpIp详解 2019年5月31日

XSS过滤 2019年5月31日

scss 2019年5月31日

响应开发 2019年5月31日

实现居中 2019年5月31日

常用标签 2019年5月31日

常见样式 2019年5月31日

网页加载顺序 2019年5月31日

规范书写 2019年5月31日

上传文件 2019年5月31日

内置对象 2019年5月31日

STL 2019年5月31日

C++Gotcha 2019年4月30日

svn client 2019年4月30日

svn ignore 2019年4月30日

C++语言的设计与演化 2019年4月30日

大象Thingking_in_UML 2019年4月30日

概述 2019年4月30日

游戏服务端开发面试 2019年4月30日

网络游戏服务器开发框架 2019年4月30日

算法竞赛入门经典 2019年4月30日

数列 2019年4月30日

计算机网络-谢希仁 2019年3月31日

MongoDB安全 2019年3月31日

PHP7.2操作MongoDB 2019年3月31日

mongo客户端命令 2019年3月31日

概述 2019年3月31日

MySQL使用军规 2019年3月31日

mysqlserver 2019年3月31日

IOC 2019年3月31日

PHP安装拓展 2019年3月31日

PHP是否适合做后台常驻程序 2019年3月31日

SPL 2019年3月31日

Yii 安全 2019年3月31日

Yii 组件 2019年3月31日

Yii 高效篇 2019年3月31日

yii2 api 2019年3月31日

memcache单例 2019年3月31日

php-my-way 2019年3月31日

php5.6里面的引用 2019年3月31日

php正则 2019年3月31日

socket 2019年3月31日

安装环境 2019年3月31日

会话控制 2019年3月31日

关于变量类型作用域 2019年3月31日

函数 2019年3月31日

异常处理 2019年3月31日

生成对象 2019年3月31日

Redis-Sentinel 2019年3月31日

事务 2019年3月31日

任务队列和发布订阅 2019年3月31日

数据类型 2019年3月31日

生产环境部署redis 2019年3月31日

配置 2019年3月31日

富文本编辑器 2019年3月31日

概念基础 2019年3月31日

网页图片 2019年3月31日

网页布局 2019年3月31日

网页文字 2019年3月31日

配色表 2019年3月31日

JSON 2019年3月31日

OOP 2019年3月31日

backbone.js 2019年3月31日

cookie-js 2019年3月31日

jquery 2019年3月31日

js对象类型检测 2019年3月31日

js模块化 2019年3月31日

requirejs 2019年3月31日

事件处理 2019年3月31日

函数 2019年3月31日

基础 2019年3月31日

对象 2019年3月31日

正则 2019年3月31日

精粹 2019年3月31日

跨域 2019年3月31日

闭包 2019年3月31日

nodejs 2019年3月31日

RUSTful 2019年3月31日

api接口设计 2019年3月31日

css面试 2019年3月31日

html面试 2019年3月31日

http 2019年3月31日

js面试 2019年3月31日

name-rule 2019年3月31日

seo 2019年3月31日

web 优化 2019年3月31日

接口验证 2019年3月31日

数字签名算法RSA 2019年3月31日

架设一个ubuntu服务器 2019年3月31日

csrf 2019年3月31日

xss 2019年3月31日

BeyondCompare 2019年3月31日

OmniGraffle 2019年3月31日

svn server 2019年3月31日

算法 2018年12月31日

1.基础 2018年12月31日