Mysql军规

一、核心军规

1、尽量不在数据库做运算

2、控制单表数据量

        ①一年内的单表数据量预估

        ②合理分表不超载

        ③建议单库丌赸过300-400个表

3、保持表身段苗条

        ①单表字段数上限控制在20~50个

4、平衡范式与冗余

5、拒绝3B

二、字段类军规

1、用好数值字段类型

2、将字符转化为数字

        数字型比字符串型索引更高效、查询更快、占用空间更小(能用数字类型就别用字符类型)

3、优先使用ENUM和SET

4、避免使用NULL字段

        缺点:很难进行查询优化

                   NULL列加索引,需要额外空间

                   含NULL复合索引无效

        举例:不要使用        ‘a’ char(32) DEFAULT NULL和  ‘b’ int(10) NOT NULL

                   应该改成        ’c‘ int(10) NOT NULL DEFAULT 0

5、少用并拆分TEXT/BLOB

        TEXT类型处理性能远低亍VARCHAR,比如会强制生成硬盘临时表和浪费更多空间(若必须使用则拆分到单独的表)

6、不在数据库里存图片

三、索引类军规

1、谨慎合理添加索引

        能不加的索引尽量不加,综合评估数据密度和数据分布和最好丌赸过字段数20%

2、字符字段必须建前缀索引

        --注意1:前缀索引只能适用于普通索引中,不能使用在unique中

        --注意2:前缀索引只支持英文和数字

                

3、不在索引列做运算

        会导致无法使用索引、导致全表索引

4、自增列或全局ID做INNODB主键

        

5、尽量不用外键

        

四、SQL类军规

1、SQL语句尽可能简单

2、保持事务(连接)短小

        事务/连接使用原则:即开即用,用完即关

        不事务无关操作放到事务外面, 减少锁资源的占用

        丌破坏一致性前提下,使用多个短事务代替长事务

3、尽可能避免使用SP/TRIG/FUNC

  

4、尽量不用 SELECT *

5、改写OR为IN()

        OR效率:O(n)
        IN 效率:O(Log n)
        当n很大时,OR会慢很多
6、改写OR为UNION
        
7、 避免负向查询和% 前缀模糊查询
8、 减少COUNT(*)
        
9、LIMIT的高效分页
10、 用UNION ALL 而非 UNION
        若无需对结果进行去重,则用UNION ALL,UNION有去重开销
11、分解联接保证高并发
        高幵发DB丌建议进行两个表以上的JOIN
        
        举例:
        MySQL> Select * from tag JOIN tag_post on tag_post.tag_id=tag.id
        JOIN post on tag_post.post_id=post.id WHERE tag.tag=‘二手玩具’;
        改为
        MySQL> Select * from tag WHERE tag=‘二手玩具’;
        MySQL> Select * from tag_post WHERE tag_id=1321;
        MySQL> Select * from post WHERE post.id in (123,456,314,141)
12、GROUP BY 去除排序
        
13、同数据类型的列值比较
         原则:数字对数字,字符对字符        
14、Load data 导数据
        
        
        批量数据快导入:
                 成批装载比单行装载更快,丌需要每次刷新缓存
                 无索引时装载比索引装载更快
                 Insert values ,values,values 减少索引刷新
                 Load data比insert快约20倍
         尽量丌用 INSERT ... SELECT,会导致延迟和同步出错
15、打散大批量更新
        
        

五、约定类军规

1、隔离线上线下

        原则:线上连线上,线下连线下

        实时数据用real库 模拟环境用sim库、测试用qa库和开发用dev库

2、禁止未经DBA确认的子查询

        

3、永远不在程序端显式加锁

4、统一字符集为UTF8、校对规则为 utf8_general_ci

5、统一命名规范

        库表等名称统一用小写

        索引命名默认为“idx_字段名”

        库名用缩写,尽量在2~7个字母

        注意避免用保留字命名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿彬在上路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值