MyISAM和Innodb的区别:
- Innodb支持事务,MyISAM不支持事务。如果在一些列增删改的时候只要哪个出错还可以回滚还原,而MyISAM就不可以。
- Innodb适合频繁修改以及涉及安全性较高的应用,MyISAM适合查询和插入为主的应用。
- Innodb支持外键,MyISAM不支持外键
- Innodb需要指定,MyISAM是默认的引擎
- Innodb不支持FULLTEXT类型的索引
- Innodb中不保存表的行数,需要扫描一遍整个表来计 算有多少行,但是MyISAM只要简单的读出保存好的行数就好
- 对于自增长的字段,Innodb中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引;清空整个表时,Innodb时一行行的删除,效率非常慢。MyISAM则会重建表
django开发中数据库优化
-
设计表的时候,尽量少使用外键,因为外键约束会影响插入和删除性能
- 使用缓存,减少对数据库的访问
- 在orm框架下设置表的时候,能用varchar确定字段长度时,就别用text
- 可以给搜索频率高的字段属性,在定义时创建索引
- 如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数
- 在模板标签中使用with标签可以缓存Qset的查询结果
- django orm框架下querysets本来就是有缓存的
- 如果一个页面自需要数据库里面的一个或者两个字段的时候,可以用queryset.values()
django如何提高性能
- 减少http请求,减少数据库的访问量
- 使用浏览器缓存,将一些常用的css,js,logo图标,这些静态资源缓存到本地浏览器
- 对html,css,js文件进行压缩,减少网络的通信量
- 搭建服务器集群,将并发访问请求,分散到多台服务器上处理
代码优化从哪些方面考虑
- 优化算法时间复杂度
- 循环优化
- 函数选择
- 并行编程
- 使用性能分析工具
- 使用dict或者set查找元素
- PyPy
- 合理使用copy和deepcopy
- 减少冗余数据
- 合理的使用生成器
数据库索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中数据。
索引的实现通常使用B_TREE。B_TREE索引加快了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据;相反,他是从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。
数据库如何优化查询效率
- 存储引擎的选择:如果数据表需要事务处理,应该考虑使用innodb,因为它完全符合ACID特性,如果不需要事务处理,使用默认存储引擎MyISAM是比较好的
- 对查询进行优化,要尽量避免进行全表扫描,首先应该考虑where及orderby设计的列上建立索引
- 应该避免在where子句中使用!=或者<>操作符,否则将引擎放弃使用索引而进行全表扫描
- 应该尽量避免where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
- 应该尽量避免在where使用or来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
- update语句,如果只更改1,2个字段,不要使用update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量的日志
- 对于多张大数据量的表JOIN,要先分页在使用JOIN,否则逻辑度会很高,性能会差
- 很多时候考虑用exists代替in
- 尽量使用数字型字段
- 尽量是哦那个varchar代替char
- 不要在where子句中“=”左边进行函数,算术运算或其他表达式运算,否则系统将可能无法正确使用索引
- 尽量使用表变量来代替临时表
- 尽量避免使用游标,因为游标的效率较差
- 避免频繁创建和删除临时表,以减少系统表资源的消耗
- 尽量避免大事务操作,提高系统并发能力
- 尽量避免向客户端返回大数据量,如果数据量过大,应该考虑吧相应需求是否合理
数据库的优化
优化索引、SQL语句、分析慢查询
设计表的时候严格根据数据库的设计范式来设计数据库
使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO
优化硬件;采用SSD,使用磁盘队列技术等
采用MySQL内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率
主从分离读写,采用主从复制把数据库的读操作和写入操作分离
使用合适的表引擎,参数上的优化
进行架构级别的缓存,静态化和分布式
不采用全文索引