未明确指定字段所属表的隐患

在修改表结构时,在 a 表新添加 name 字段,b 表本事就有 name 字段;原来的项目中有 a b 表的关联查询,并用到了 name 字段

这时,因为 a 表中也添加了 name 字段,原来 name 指的是 a 还是 b 表中的变的不确定了,造成报错。

主要原因就是在连表时:未明确指定字段所属表,造成了伏笔。

数据库枚举值的坑

在数据库使用枚举时可以规范数据字典,但是也造成了要添加值时,需要修改数据库结构,这是不可接受的。

而且枚举值查询可以使用 0,1,2.. 索引值进行查询,也可以使用 ‘public’ ‘private’ 这样的规定的字典值查询,有二义性,可能有伏笔。

字典类型的字段我都以 _type 结尾,tinyint 型,无符号,数字代表的值写在字段注释里。eg: book_type

是否 概念的字段也不要用 枚举,我会使用 is_ 开头。eg: is_review

补充说明:

枚举类型不但可以使用下标 0,1,2.. 查询,也可以使用不加引号的 0,1,2..(下标)来写入某个类型。

举个栗子:

类型:enum('none','public','private','1') 当你 insert into ... set a = 1 时:

a = 1 是插入 enum 的第一个值,即 public。

a = '1' 是插入 enum 值为 1 的类型。

所以在 PHP 弱类型语言中,数字可以不加单引号,所以要注意到这点。

ThinkPHP 3 addAll 插入错误

在使用 addAll 插入多条数据时,要保证每条数据的结构是一样的,数组的 key 不要有多有少,会导致插入失败。

修改存储引擎和大数据更快导入

今天要修改一个表的 存储引擎,表有 2G 数据,直接修改等了 1 个多小时都没完成。

所以想到先 mysqldump --no-create-info 导出数据,然后清空表,修改存储引擎,再倒回数据。

倒回数据时,数据导入越来越慢,想到可能是 索引 问题,然后删除索引,再倒回数据果然快很多。

MySQL导出所有Index和约束的方法

提问:更改存储引擎的初衷是什么?更改前后有什么质的变化?

原来是 MyISAM 历史问题,现在库中的表统一使用 InnoDB。

对于数据库优化,首先还是要考虑 SQL 优化,表的设计优化,其次才是数据库设置优化。

MyISAM 理论上读更快,表级锁,没事务;但是一般都是推荐使用 InnoDB 再具体原因还不清楚。

NGINX 没有配置结束符的伏笔

location ~*.xml$ {
rewrite '^/sitemap/([a-z_0-9]*)\.(xml)$' /sitemap/$1 last;
add_header X-Robots-Tag noindex;
}

这是配置 sitemap XML 转发和添加 header,在 ~*.xml$ 中,如果没有 $ 会造成只要 slug 中有 xml 就进行了转发。eg: /abc/abcxmldef 将被转发 这是不符合预期的。

MySQL 连接遇到的端口问题

自己的电脑有两个 MySQL 服务,一个 3306 一个 3307。

在使用 mysql -uroot -p -P3307 这样指定端口连接是无效的。

其实这个是 MySQL 故意设计的,如果你的 host 是 localhost(如果不指定默认也是 localhost),那 MySQL 必须用 unix socket 连接,那样的话设置端口什么的当然没用啦。所以正确的做法是指定 host 为 127.0.0.1 再指定端口,绝对管用。

查看端口:

show global variables like 'port';

MySQL 客户端的指定端口问题

MySQL 配合文件的读取顺序和位置可以通过 mysql --help 查看。

测试,坚持如一

今天发现了:因为测试不全导致的手机端部分页面显示异常的情况。

问题的发现还是用户发现后反馈的。

原因:手机端的页面代码位置应该总体是和 PC 端是一致的,但是在整理代码时,一个两端的结构差异导致了缺少引用一个 JavaScript 库,在测试过程中,没有测试到此一级页面,PC 端代段此级正常。

还是自己懈怠了, 测试,坚持如一,欠的总会还。引以为戒。

MySQL 用户不同导致的数据库无法打开

使用 Navicat 无法打开数据库,提示大概是权限什么的问题,使用 mysql 命令是可以的。

后来发现是:在线上建立了一个视图,使用的是一个远程用户,后来数据备份,视图也被备份到本地了。但是这个远程用户在本地是没有的,所以导致使用 Navicat 时,无法打开数据库。

页面中 JavaScript 中正则表达式中的特殊字符被转码

今天遇到 HTML 页面中直接写了 JavaScript 的验证的表达式:

'[©]+'

里面涉及了一个特殊字符 ©,页面第一次加载时,一起正常,但是 ajax 提交后,pjax reload 页面后,©encode

解决方法:使用 unicode [\\u00A9]+·

一款很秀的 正则表达式 工具推荐给大家 jex.im/regulex

Firefox word-break: break-word

Firefox 疑似不支持 word-break: break-word 对词进行折行

  • Use word-break: break-all; instead of word-break: break-word;
  • Or, Use word-wrap: break-word; instead of word-break: break-word;

所以 CSS 编写要考虑好厂商差异,亟待使用前端工具,最近准备使用 gulp 优化项目前端

Word-break:break-word not working in Firefox 21

Policy 条款要认真对待

在做部分功能是违反了 Google Policy,被直接标记为恶意网站,流量骤降。

对应敏感信息要认真对待不可轻视。

数据查询的 N+1 问题

N+1 查询问题 就是查询扩展字段时的循环查询问题。

为了解决 N+1 问题我使用了模型 预加载 方式,但是由于后台框架限制(也可能是使用不当),将 一对多 的被关联的模型数据都查出来了,数据量很大,导致页面卡顿,一次反向优化。

优化要权衡不能硬搬书本。