在实际项目中,通过设计表架构时,设计系统结构时,查询数据时综合提高查询数据效率

1.适当冗余

数据库在设计时遵守三范式,同时业务数据(对数据的操作,比如资料审核,对某人评分等)和基础数据(比如资料详情,用户描述等)要分开存储,放在不同表中。在设计数据库时,三范式能够最大限度的节省 数据库存储所需的空间,可是缺点是 在查询,修改等操作时,会造成查询缓慢,效率低下。所以对于经常查询的字段应该适当的添加到同一个表中,适当冗余,不必严格按照三范式进行设计,这样 通过舍弃部分存储空间,提高查询效率,能够得到更好的用户体验。

For example:用户基本信息表(用户名,密码,身高,体重,三围),用户信息审核表(审核状态,用户id);系统需求:要求显示审核结果时知道每个用户的用户名和审核状态;那么严格按照三范式,需要查询两张表;如果把用户名添加到 用户信息审核表 中时,只需查询一张表,查询时间肯定小于多表查询。

冗余字段添加条件:经常进行查询的字段放在同一个表中,避免多表查询

2.数据查询时,少用in进行查询

in进行的是全表查询,不使用索引

For instance:

用关联查询:

用in进行嵌套查询:

所以尽量少用in进行查询,多用其他的进行代替;如 between 2 and 4 代替  in (2,3,4) 等等。

3.尽量少设置外键关联

在项目初期进行版本迭代时,对于以后版本无法预测的变更,尽量少使用外键关联,减少表间依赖强度,为以后版本设计提供基础。因为外键关联时,修改删除等操作非常繁杂。

在保证数据完整性时,尽量少设置外键关联,省去每次查询外键是否存在的时间。比如 国家免检产品,在保证产品质量(本表)的前提下,充分相信制造商(外键对应的表)

4.使用redis缓存机制

对于重复查询,没有改变的数据,可以使用redis缓存机制,直接访问内存数据,不再访问数据库,减少访问数据库的时间(数据库在硬盘上,redis缓存在内存中)。思路是:读取数据库数据到redis缓存中,从redis中取数据给前端。如果涉及到数据修改不大的,可以修改到redis中,固定时间同步到数据库,保证数据统一完整性。

5.查询时 尽量不要用 select * from tables;

*代表取表中一组数据到内存中,增加内存消耗,只取需要的字段,如 select id from tables;

在python的sqlalchemy库时,尽量不要用  Table.query.filter_by(id=1).first()  ==》select * from Table where id=1   ;应该使用db.session.query(Table.id).filter(Table.id==1).fitst()  ==》 select id from tables where id=1;

6.使用index索引进行查询优化

把索引建在经常查询的字段,主键,外键,WHERE子句中的数据列,出现在关键字order by、group by、distinct后面的字段。

索引创建方法:http://www.cnblogs.com/lixiuran/p/6144319.html,注意索引不同

7.在使用order by进行排序时,最好被排序的字段是索引

8.其他方法:http://www.cnblogs.com/petitprince/archive/2010/11/23/1885994.html

大致思路:减少数据存储空间,减少访问数据库次数,减少读取到内存中的数据量。

mysql数据库优化(一)的更多相关文章

  1. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  2. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  5. 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...

  6. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  8. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  9. 关于mysql数据库优化

    关于mysql数据库优化 以我之愚见,数据库的优化在于优化存储和查询速度 目前主要的优化我认为是优化查询速度,查询速度快了,提高了用户的体验 我认为优化主要从两方面进行考虑, 优化数据库对象, 优化s ...

  10. mysql数据库优化 pt-query-digest使用

    mysql数据库优化 pt-query-digest使用 一.pt-query-digest工具简介 pt-query-digest是用于分析 mysql慢查询的一个工具,它可以分析binlog.Ge ...

随机推荐

  1. Redis的使用原理

    原理介绍 (1)什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) (2)Reids的特点 Redis本质上是一个Key-Val ...

  2. Codeforces 977D: Divide by three, multiply by two(暴力)

    题意 有nnn个无序的数,对这些数进行排列,要求ai=3×ai+1a_i=3\times a_{i+1}ai​=3×ai+1​或2×ai=ai+12\times a_i=a_{i+1}2×ai​=ai ...

  3. bee: command not found问题解决之道

    $ bee bash: bee: command not found 遇到这个错误的时候,我希望您是所有环境全部安装好的情况下遇到的,如果你的环境没有安装好请参考 beego环境搭建http://bl ...

  4. position(3rd week blog)

    static:静态的默认属性,上(top)下(bottom)左(left)右(right)等参数不会执行没有影响.relative:此属性会根据上(top)下(bottom)左(left)右(righ ...

  5. webbug3.0靶场第二关

    由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...

  6. SSL Certificate Signed Using Weak Hashing Algorithm 和SSL Medium Strength Cipher Suites Supported的解决方案

    这两天有个项目被扫描器报了几个中危,都是SSL证书的问题.记录一下解决方案吧. 第一个问题:SSL Certificate Signed Using Weak Hashing Algorithm 这里 ...

  7. 13. Forensics (取证 4个)

    Maltego是一个取证和数据挖掘应用程序. 它能够查询各种公共数据源,并以图形方式描绘人员,公司,网站和文档等实体之间的关系. Maltego也是一个开源智能,但不是开源软件. Helix The ...

  8. 11. IDS (Intrusion detection systems 入侵检测系统 6个)

    Snort该网络入侵检测和防御系统擅长于IP网络上的流量分析和数据包记录. 通过协议分析,内容研究和各种预处理器,Snort可以检测到数千个蠕虫,漏洞利用尝试,端口扫描和其他可疑行为. Snort使用 ...

  9. Vue通过路由 query传递参数

    父组件通过query来传递num参数为1,相当与在 url 地址后面拼接参数 <template> <div> <h3>首页</h3> <rout ...

  10. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...