Django项目开发实战
上QQ阅读APP看书,第一时间看更新

3.6 MySQL实践

MySQL是世界上广泛使用的开源关系数据库管理系统之一。它以高性能、高可靠性和易用性而越来越受到市场欢迎。Django的数据层提供了各种方法来帮助开发人员充分利用数据库。

  • 找出查询中的性能瓶颈。可以使用QuerySet.explain( )方法来了解数据库执行QuerySet的细节。
  • 使用索引。索引不仅仅是主键或者唯一约束键。如果某字段经常被查询到,那么绝大多数情况下应该给它加上索引。
  • 计算上移。数据库的计算资源是非常宝贵的,一般情况下应该尽量将计算上移到应用层。例如,少用order_by( ),不推荐使用存储过程。另外,QuerySet的count( )方法和exists( )方法是非常快的,如果要得到数据集的行数或者确定数据是否存在,那么应该采用这些方法。
  • 使用缓存。MySQL服务器默认开启了查询缓存的功能,这是提升性能的有效方式之一。当一条查询被执行很多次时,查询结果会直接从缓存中读取。如果SQL中包含某些方法[如CURDATE( )、NOW( )、RAND( )等],则数据库执行这条SQL语句时不会使用缓存,因此在使用的时候尽量避免使用这些方法。
  • 选择正确的存储引擎。一般情况下,推荐使用InnoDB。
  • 获取想要的数据。查询的数据越多,查询的效率越慢。因为这会增加磁盘I/O的时间。可以使用QeurySet的values( )方法和values_list( )方法指定想要查询的字段。
  • 设计ID字段。为每一张表设计一个ID字段,并设置为主键和自增ID。这也是Django的默认行为。
  • 批量操作。当操作多个对象时,尽量使用bulk_create( )方法,这会减少SQL查询的数量。
  • 使用utf8mb4编码。MySQL的utf8是一种专属的编码,它能够编码的Unicode字符并不多;MySQL的utf8mb4是真正的UTF-8。
  • 尽可能一次性获取想要的数据。多次访问数据库通常比在一个查询中检索所有数据的效率低,特别是在循环执行查询时,因此当只需要一个查询时,可能实际上执行了许多次数据库查询。在这种情况下使用QuerySet的select_related( )方法和prefetch_related()方法会很有用。