一、库表设计

1.1 引擎选择

在 mysql 5.1 中,引入了新的插件式存储引擎体系结构,允许将存储引擎加载到正在运新的 mysql 服务器中。使用 mysql 插件式存储引擎体系结构,允许数据库专业人员或者设计库表的软件开发人员为特定的应用需求选择专门的存储引擎,完全不需要管理任何特殊的应用编码要求,也无需考虑所有的底层实施细节。因此,尽管不同的存储引擎具有不同的能力,应用程序是与之分离的。此外,使用者可以在服务器、数据库和表格三个层级中存储引擎,提供了极大的灵活性。

mysql 常用的存储引擎包括 MYISAM、Innodb 和 Memory,其中各自的特点如下:

1、MYISAM : 全表锁,拥有较高的执行速度,一个写请求请阻塞另外相同表格的所有读写请求,并发性能差,占用空间相对较小,mysql 5.5 及以下仅 MYISAM 支持全文索引,不支持事务。

2、Innodb:行级锁(SQL 都走索引查询),并发能力相对强,占用空间是 MYISAM 的 2.5 倍,不支持全文索引(5.6 开始支持),支持事务。

3、Memory : 全表锁,存储在内存当中,速度快,但会占用和数据量成正比的内存空间且数据在 mysql 重启时会丢失。

基于以上特性,建议绝大部份都设置为 innodb 引擎,特殊的业务再考虑选用 MYISAM 或 Memory ,如全文索引支持或极高的执行效率等。

1.2 分表方法

在数据库表使用过程中,为了减小数据库服务器的负担、缩短查询时间,常常会考虑做分表设计。分表分两种,一种是纵向分表(将本来可以在同一个表的内容,人为划分存储在为多个不同结构的表)和横向分表(把大的表结构,横向切割为同样结构的不同表)。

其中,纵向分表常见的方式有根据活跃度分表、根据重要性分表等。其主要解决问题如下:

1、表与表之间资源争用问题;

2、锁争用机率小;

3、实现核心与非核心的分级存储,如UDB登陆库拆分成一级二级三级库;

4、解决了数据库同步压力问题。

横向分表是指根据某些特定的规则来划分大数据量表,如根据时间分表。其主要解决问题如下:

1、单表过大造成的性能问题;

2、单表过大造成的单服务器空间问题。

1.3 索引问题

索引是对数据库表中一个或多个列的值进行排序的结构,建立索引有助于更快地获取信息。 mysql 有四种不同的索引类型:

1、主键索此 ( PRIMARY )

2、唯一索引 ( UNIQUE )

3、普通索引 ( INDEX )

4、全文索引(FULLTEXT , MYISAM 及 mysql 5.6 以上的 Innodb )

建立索引的目的是加快对表中记录的查找或排序,索引也并非越多越好,因为创建索引是要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间维护索引。

在设计表或索引时,常出现以下几个问题:

1、少建索引或不建索引。这个问题最突出,建议建表时 DBA 可以一起协助把关。

2、索引滥用。滥用索引将导致写请求变慢,拖慢整体数据库的响应速度(5.5 以下的 mysql 只能用到一个索引)。

3、从不考虑联合索引。实际上联合索引的效率往往要比单列索引的效率更高。

4、非最优列选择。低选择性的字段不适合建单列索引,如 status 类型的字段。

二、慢 SQL 问题

2.1 导致慢 SQL 的原因

在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL 有很多因素,甚至包括硬件和 mysql 本身的 bug。根据出现的概率从大到小,罗列如下:

1、SQL编写问题

2、锁

3、业务实例相互干绕对 IO/CPU 资源争用

4、服务器硬件

5、MYSQL BUG

2.2 由 SQL 编写导致的慢 SQL 优化

针对SQL编写导致的慢 SQL,优化起来还是相对比较方便的。正如上一节提到的正确的使用索引能加快查询速度,那么我们在编写 SQL 时就需要注意与索引相关的规则:

1、字段类型转换导致不用索引,如字符串类型的不用引号,数字类型的用引号等,这有可能会用不到索引导致全表扫描;

2、mysql 不支持函数转换,所以字段前面不能加函数,否则这将用不到索引;

3、不要在字段前面加减运算;

4、字符串比较长的可以考虑索引一部份减少索引文件大小,提高写入效率;

5、like % 在前面用不到索引;

6、根据联合索引的第二个及以后的字段单独查询用不到索引;

7、不要使用 select *;

8、排序请尽量使用升序 ;

9、or 的查询尽量用 union 代替 (Innodb);

10、复合索引高选择性的字段排在前面;

11、order by / group by 字段包括在索引当中减少排序,效率会更高。

除了上述索引使用规则外,SQL 编写时还需要特别注意一下几点:

1、尽量规避大事务的 SQL,大事务的 SQL 会影响数据库的并发性能及主从同步;

2、分页语句 limit 的问题;

3、删除表所有记录请用 truncate,不要用 delete;

4、不让 mysql 干多余的事情,如计算;

5、输写 SQL 带字段,以防止后面表变更带来的问题,性能也是比较优的 ( 涉及到数据字典解析,请自行查询资料);

6、在 Innodb上用 select count(*),因为 Innodb 会存储统计信息;

7、慎用 Oder by rand()。

三、分析诊断工具

在日常开发工作中,我们可以做一些工作达到预防慢 SQL 问题,比如在上线前预先用诊断工具对 SQL 进行分析。常用的工具有:

1、mysqldumpslow

2、mysql profile

3、mysql explain

具体使用及分析方法在此就不赘述,网上有丰富的资源可以参考。

四、误操作、程序 bug 时怎么办

提出这个问题显然主要是针对刚开始工作的年轻同行们……实际上误操作和程序 bug 导致数据误删或者混乱的问题并非少见,但是刚入行的开发工作者会比较紧张。一个成熟的企业往往会有完善的数据管理规范和较丰富的数据恢复方案(初创公司除外),会进行数据备份和数据容灾。当你发现误操作或程序 bug 导致线上数据被误删或误改动时,一定不能慌乱,应及时与 DBA 联系,第一时间进行数据恢复(严重时直接停止服务),尽可能减少影响和损失。对于重要数据(如资金)的操作,在开发时一定要反复进行测试,确保没有问题后再上线。

mysql 字段加减_Mysql常见问题及优化相关推荐

  1. mysql 字段加减_MySQL数据库开发常见问题及优化(续)

    在设计表或索引时,常出现以下几个问题: 1.少建索引或不建索引.这个问题最突出,建议建表时 DBA 可以一起协助把关. 2.索引滥用.滥用索引将导致写请求变慢,拖慢整体数据库的响应速度(5.5 以下的 ...

  2. mysql 字段加减_MySQL中你必须了解的函数

    在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重.小编刚开始学习的时候也会有这个感觉.不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个.今天小编就把常 ...

  3. mysql 字段加减_Mysql数据清洗—Null值的处理技巧

    1:首先要了解为什么库中会存在Null值? 答:举个例子,市面上部分产品的的注册页会要求用户填写邀请码,这样邀请人才会得到奖励,如果用户注册的时候不是被其他人邀请注册的,那么无需填写邀请码,直接注册即 ...

  4. mysql 时间戳加减_mysql加减时间-函数-时间加减

    mysql加减时间-函数-时间加减 mysql加减时间-函数-时间加减 1. MySQL 为日期增加一个时间间隔:date_add() set @dt = now(); select date_add ...

  5. mysql月份加减_MySQL 日期加减

    1. addtime() 为日期加上指定秒数 select addtime(now(),1); -- 加1秒 2. adddate() 有两种用法,第二个参数直接填数字的话是为日期加上指定天数,填in ...

  6. mysql 两个日期加减_mysql 日期加减

    mysql日期加减 一.MySQL 为日期增加一个时间间隔:date_add(). 1.  示例: set @dt = now(); select date_add(@dt, interval 1 d ...

  7. mysql中时间加1怎么弄,mysql 日期加减

    mysql日期加减 一.MySQL 为日期增加一个时间间隔:date_add(). 1.  示例: set @dt = now(); select date_add(@dt, interval 1 d ...

  8. MySQL 日期加减

    MySQL日期加减 data_add\data_sub mysql进行日期加减法时,应避免直接使用+或-符号进行,否则遇到月初月末就会产生未知的异常. 实验如下: SELECT DATE_FORMAT ...

  9. mysql字段简索引_Mysql索引优化攻略(全)

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

最新文章

  1. 25岁Nature狂魔八连杀!曹原再次“一作+通讯”发Nature!
  2. apache mahout_Apache Mahout:入门
  3. html5_canvas初学
  4. vue NoData
  5. platform_device_add()函数分析
  6. DataTable转换成List
  7. 【ArcGIS|空间分析】图像纠正
  8. SDL(01-10)
  9. 安卓开关Switch使用的小细节
  10. Ubuntu 压缩多个vmdk文件
  11. 快速删除node_modules文件夹:rimraf node_modules
  12. HDU 4509 hash
  13. 汽车门把手的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 《C专家编程》1-2章阅读收获
  15. No module named 'gensim'
  16. java around_关于Aop切面中的@Before @Around等操作顺序的说明
  17. 前端基础——css进阶(三)
  18. 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解
  19. VC苹果版:iPhone iOS下载安装《罪恶都市》侠盗飞车GTA的方法
  20. FocusBI:租房分析星型模型

热门文章

  1. 万字综述,GNN在NLP中的应用,建议收藏慢慢看
  2. 2021为什么大家都在选做独立站运营?
  3. 软件接口测试一个项目的实战,全网最全postman接口测试教程和接口项目实战~从入门到精通!!!...
  4. Leetcode每日一题:424.longest-repeating-character-replacement(替换后的最长重复字符)
  5. 网商微信实名认证FAQ
  6. [置顶] 怎么对待重复的代码
  7. table中添加下拉框
  8. 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)
  9. c语言代码re通常什么错误,C语言,realloc动态内存申请,出现报错double free or corruption (!prev)...
  10. UCMA(OCS) 开发系列之二(安装与部署)