架构设计

表结构设计

索引

sql语句

1.表结构设计的核心思想是什么?

容量评估,性能优化,硬件升级,垂直拆分,水平拆分

2.有个大表为了一个查询(一天就查2次),领导要你建索引(索引空间大小有500G),

你怎么考虑,是建还是不建?建索引时要考虑哪些因素?

3.执行计划中有 filesort 就会进行磁盘文件排序吗(详细说明)?

Using filesort:当我们的Query 中包含ORDER BY 操作,而且无法利用索引完成排序操

作的时候,MySQL Query Optimizer 不得不选择相应的排序算法来实现。

数据库的范式:

1NF):数据库表中的字段都是单一属性的,不可再分,这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等

2NF):数据库表中不存在非关键字段 对任一候选关键字段 的部分 函数依赖

选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分)

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

3NF):在第二范式的基础上,数据表中如果不存在非关键字段 对任一候选关键字段 的传递 函数依赖 则符合第三范式。

所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A

学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号"

(学号) → (所在学院) → (学院地点, 学院电话)即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖

在商业环境中,绝大多数超越第3范式的设计都是不切实际的。 由范式的进阶来看,越高等级的范式所产生的表越多,

而在应用程序使用的过程中越多的表Join和查询造成的性能损耗的问题,甚至很多情况下为了兼顾性能和开发我们甚至要做一下反范式的操作

1 表字段类型选择

tinyint,int,bigint

decimal(m,n)

datetime,timestamp

varcahr(n)

utf8

表容量评估,数据归档评估

架构设计

读写分离,schema解耦,冷热数据分表

表结构设计:INNODB,auto increment primary key,comment

原则:只增不减,自增主键,主键不应该被修改,不用字符串做主键,拆开宽表

varchar(500),控制单表数据量,越短越好

控制列数量

表字段数少而精

IO高效、全表遍历、表修复快、 提高并发、 alter table快

单表多少字段合适?

单表1G体积500W行评估

顺序读1G文件需要N秒

单行不超过200Byte

单表不超50个纯INT字段

单表不超20个CHAR(10)个字段

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

update_time timestamp not null default current_timestamp on update current_timestamp

default 0,不使用default null

default ''

不使用text,blob

索引字段定义not null

禁用外键

数字型VS字符型索引:更高效、查询更快、占用空间更小

示例:

mysql> create table yhq_t11(id int unsigned);

mysql> insert into  yhq_t11 values (INET_ATON('127.0.0.1'));

mysql> select * from  yhq_t11;

| id |

+------------+

| 2130706433 |

mysql> SELECT INET_NTOA(id) from  yhq_t11;

| INET_NTOA(id) |

存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE

尽可能不要使用TEXT、 BLOB

1) 索引排序问题,只能使用max_sort_length的长度或者手工指定ORDER BY SUBSTRING(column,

length)的长度来排序

2) Memory引擘不支持text,blog类型,会在磁盘上生成临时表

3) 可能浪费更多的空间

4) 可能无法使用adaptive hash index

5) 导致使用where没有索引的语句变慢

6) Varchar的性能会比text高很多

为什么不要default NULL

索引不会包括NULL值。影响索引的统计信息,影响优化器的判断。

复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的, NULL字段很难查询优化

(NULL字段无法索引) 。

a)如果null字段被索引,需要额外的1字节作为判断是否为NULL的标志位“需要mysql内部进行特殊处理)

b)使索引,索引统计,值的比较变得更复杂

c)可用0,” 代替

d)如果是索引字段,一定要定义为not null

不在数据库里存图片

索引

1.唯一键不和主键重复。

2.不要修改聚焦索引。

3.使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现: Using File Sort, UsingTemporary。

4.索引不是越多越好,尽量合并索引,合理创建联合索引(避免冗余)。

5.合理利用覆盖索引,结合核心SQL优先考虑覆盖索引。

6.不要修改聚集索引(主键)

7.不要给选择性低的字段建单列索引, MySQL对索引的过滤性有要求,如果过滤性太低, MySQL会放弃使用

例如:不要给“性别”列创建索引。

8.不要使用外键约束

9.字符类型字段尽量使用前缀索引, 太长的索引不仅影响写入性能,而且使用性能也差

10.能不加的索引尽量不要加

综合评估数据密度和数据分布

最好不超过字段数20%

sql语句

慎用count(*)

Count(*)的资源开销大,尽量不用少用!

实时统计:用memcache,双向更新,零晨跑基准

非实时统计:尽量用单独统计表,定期重算

select /*+first_rows(1)*/ count(*) from t1 where rownum<2;

比如,有些应用,只是想看看我表里是否有数据,或者满足某个条件的,是否有数据。

用first_rows来作。

sql语句尽可能简单

拒绝大SQL,拆解成多条简单SQL

减少锁时间

用上更多CPU

简单SQL缓存命中率更高

INSERT语句使用batch提交

降低CUP,不在数据库做运算

select id*16 from  yhq_t1;

上面的语句放在MySQL不起眼,不是很明显,这些运算没必要放在数据库里,数据库尽量做到简

单,数据库就检索数据,对这些数据的加工就放在应用层。

让数据库多做她擅长的事:

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

2)复杂运算移动程序端CPU

3)尽可能简单应用MySQL

必须使用绑定变量, 避免常量的直接引用

频繁的硬解析会影响数据库性能

ibatis中,所有的 ##都是绑定变量

mysql设计与实现_mysql设计与开发相关推荐

  1. mysql左对齐原则_MySQL 设计与开发规范

    MySQL 设计与开发规范 1 目的 本规范的主要目的是希望规范数据库设计与开发,尽量避免由于数据库设计与开发不当而产生的麻烦:同时好的规范,在执行的时候可以培养出好的习惯,好的习惯是软件质量的很好保 ...

  2. mysql数据库业务逻辑_Mysql业务设计(逻辑设计)

    逻辑设计 数据库设计三大范式 数据库设计第一大范式 数据库表中所有的字段都只具有单一属性 单一属性的列是由基本数据类型所构成 设计出来的表都是简单的二维表 数据库设计的第二大范式 要求表中只有一个业务 ...

  3. mysql 源码设计,java+mysql大学网络社区平台设计+源代码

    摘要如今,信息管理与信息系统的网络平台上,更多的都是一些静态信息的介绍,缺乏老师与老师之间, 老师与同学之间信息的交流的功能. 因此, 需要建立一个从 Web 1.0转换到 Web 2.0 的, 能够 ...

  4. java毕业生设计爱心公益网站设计与制作计算机源码+系统+mysql+调试部署+lw

    java毕业生设计爱心公益网站设计与制作计算机源码+系统+mysql+调试部署+lw java毕业生设计爱心公益网站设计与制作计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B ...

  5. 基于java+SpringBoot+HTML+MySQL精准扶贫网站的设计与实现

    源码+原文获取方式: 私信获取源码+原文 目  录 摘 要 Abstract 1  绪论 1.1  项目背景 1.2  精准扶贫系统的研究现状 1.3  项目适用范围 2  可行性研究与关键技术 2. ...

  6. 【java毕业设计】基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码)——村镇旅游网站

    基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于javaEE+原生Servlet+MySql的村镇旅游网站设计与实现,文章末尾 ...

  7. java毕业设计——基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码)——电影评论网站

    基于Java+Bootstrap+Mysql的电影评论网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+Bootstrap+Mysql的电影评论网站设计与实现,文章末尾附有本毕 ...

  8. 【php毕业设计】基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码)——校园新闻网站

    基于php+mysql+apache的校园新闻网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的校园新闻网站设计与实现,文章末尾附有本毕业设计的论文和源 ...

  9. 基于Python+Django+MYSQL的ERP管理系统的设计与实现

    基于Python+Django+MYSQL的ERP管理系统的设计与实现  源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ ERP管理系统是商业信息管 ...

最新文章

  1. 【mysql函数】find_in_set和locate(substr,str)的区别
  2. js获取过滤条件中参数的快捷方式
  3. 网站如何进行渠道跟踪_开发网站不知道如何进行推广?5个技巧教会你
  4. python官网下载步骤linux-linux下安装python
  5. .NET如何以 回车换行符 拆分字符串?
  6. 视频码率,帧率和分辨率的区别
  7. 鸿蒙OS加持!华为MatePad2系列将搭载骁龙888/麒麟9000芯
  8. PHPInfo()信息泄漏——综合利用提权
  9. 关于微信公众号的测试
  10. 转载:Apache Ignite(一):简介以及和Coherence、Gemfire、Redis等的比较
  11. ptp输出内容包含什么_PTP 无线传输
  12. Typo Forum
  13. Swagger设置密码登录
  14. 贺新春丨大年初六 六六大顺
  15. win8系统桌面计算机,Win8计算机桌面管理软件
  16. 进入BeOS的花花世界 系列三
  17. cf 834 E. Ever-Hungry Krakozyabra
  18. Jenkins在windows下的安装和部署
  19. 计算机辅助设计技术有哪些优点,计算机辅助设计技术在机械设计中的应用探讨...
  20. SecurityManager——Java 语言的保护伞

热门文章

  1. Angular list列表的事件响应实现
  2. 电脑重装系统之后git pull报错 Permission denied (publickey)
  3. 如何在SAP社区上查找其他SAP从业者遇到的问题或者提新问题
  4. SAP Analytics Cloud关于Smart Predict功能的说明
  5. Scala enumeration
  6. SAP OData batch request的并行处理实现原理
  7. Fiori Launchpad server side config json
  8. 批量修改product description
  9. why my pricing procedure is not determined in QHD 504
  10. 计算机函授本科题库,计算机应用基础函授本科考试题库