1. mysql创建表的时候 字段尽量不要给NULL
- NULL需要占用额外的存储空间
- 进行比较的时候会更加复杂
- 含有NULL值的列,会对SQL优化产品影响,尤其是组合索引
2. WHERE从句中不对列进行函数转换和表达式计算
SELECT date(goods_storage_move.record_time) AS date, sum(1) AS count
FROM goods_storage_move
WHERE
goods_storage_move.shop_id = 104
AND goods_storage_move.STATUS = 1
AND date( goods_storage_move.create_time ) >= '2021-03-01'
AND date( goods_storage_move.create_time ) <= '2021-03-09'
GROUP BY
date(
goods_storage_move.record_time)
类似于这种在where中使用了date函数 会造成create_time索引失效
3. 设计索引的时候需要考虑前后顺序
class StatisticBasketDaily(Statistic_MapBase, TimeBaseMixin):
__tablename__ = "statistic_basket"
__table_args__ = (
Index(
"ux_shop_goods_date_customer",
"shop_id",
"goods_id",
"customer_id",
"is_period",
"statistic_date",
unique=True,
),
Index("ix_shop_date", "shop_id", "is_period", "statistic_date",),
Index(
"ix_shop_goods_date", "shop_id", "goods_id", "is_period", "statistic_date",
),
)
带有时间字段的 between and > >= < <= 如果放在中间就会走不到索引 所以一般带有查询的索引都会放在最后面
4. 隐式转换会导致索引失效
select name,phone from shop_customer where id = '111';
类似于id做了字符串转换会造成id主键索引失效
5. in操作 or操作 %操作
in的值不要超过500个否则很可能走不到合适索引
or、!=、notin大多数情况很少能利用到索引 可以改成in查询 或者union all
"%name%" 只要%在前面是走不到索引
6. union union_all
能够用union_all查询就尽量不要用union查询 因为union查询需要排序然后排除相同的数据
7. 数据库设计小数的时候尽量都用decimal
能够不用float就不用 可以用decimal来保存精度
Decimal类型为精准浮点数,在计算时不会丢失精度
8. 索引命名
主键索引名为 pk_字段名 唯一索引名为 uk_字段名 普通索引idx_字段名
开发维护起来一目了然
9. 拆分大的SQL为多个小的SQL
大SQL会产生大事务,数据库阻塞
数据量过大 会把cpu打满
10. 大字段 访问低频字段拆分处理
建议将大字段、访问低频的字段用单独的表存储 分离冷热数据 减少表的宽度
可以减少磁盘io 减少内存的占用
11. join表的先后顺序
选择驱动表还是很关键的 一般都是小表驱动大表 join 其实走的是一个嵌套查询
关联表的字段务必要有索引 否则效率就很低(尽管mysql内部针对无索引的join做了一定的算法优化)
LEFT JOIN 一般以左表为驱动表 RIGHT JOIN一般则是右表
INNER JOIN 一般以结果集少的表为驱动表(mysql帮我们做的事)
12. 建议控制单表数据量
尽量控制单表数据量的大小,建议控制在500万以内
500万并不是MySQL数据库的限制 修改表结构 索引 更快 也可以避免一些慢查询
13. func.count和count()区别
在使用sqlachemy的时候 尽量使用func.count
func.count生成的语句为 select count() from table where ...
count 生成的是 select count() from (select * from tabel where ...)
如果数据量比较大的话 count() 的效率就比较低了
14. 避免在循环里面进行查询
应该是循环外面的map来进行处理 for循环里面需要来获取数据就好
以上是个人在工作中体会比较深刻的 后续会继续在这里完善 希望能够给大家带来帮助