架构设计
表结构设计
索引
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设计与开发的更多相关文章

  1. MySQL 设计与开发规范

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

  2. MySQL 设计与开发规范2

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

  3. MySQL生产库开发规范

    MySQL开发规范 文件状态: [  ] 草稿 [√] 正式发布 [  ] 正在修改 文件标识:   当前版本: V1.0  作    者: 贺磊  完成日期: 2016-05-24 变更记录 序号  ...

  4. Geoserver+Openlayers+MySQL设计思想,GeoServer服务器搭建(Docker构建镜像)

    Geoserver+Openlayers+MySQL设计思想,GeoServer服务器搭建(Docker构建镜像) 一.geoserver+openlayers+mysql主要设计思想 1.1 Geo ...

  5. SharePoint 是哪些人设计、开发的?

    闲下来的时候,我有时候会想:SharePoint 是哪些人设计.开发的? 毕竟,你说一个单选的字段,你从列表里面添加的时候,字段类型选的是 “Yes/No”:而如果你是通过编程把它加入列表的时候,字段 ...

  6. 基于 Angularjs&Node.js 云编辑器架构设计及开发实践

    基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...

  7. 从设计到开发,硅谷技术专家教你做“声控”APP

    编者:本文为携程机票研发部技术专家祁一鸣在携程技术微分享中的分享内容,关注携程技术中心微信公号ctriptech,获知更多一手干货. [携程技术微分享]是携程技术中心推出的线上公开分享课程,每月1-2 ...

  8. 会员管理系统的设计和开发(2)-- RDLC报表的设计及动态加载

    在上篇<会员管理系统的设计和开发(1)>介绍了关于会员系统的一些总体设计思路和要点,经过一段时间开发,软件终于完成并发布.在这期间,碰到了不少技术难点,并积累了不少开发心得和经验,本篇继续 ...

  9. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

随机推荐

  1. LeetCode第[55]题(Java):Jump Game

    题目:跳跳游戏 难度:Medium 题目内容: Given an array of non-negative integers, you are initially positioned at the ...

  2. AtCoder ARC097C Sorted and Sorted:dp

    传送门 题意 有 $ 2n $ 个球排成一行,其中恰好有 $ n $ 个白球和 $ n $ 个黑球.每个球上写着数字,其中白球上的数字的并集为 $ \lbrace 1 \dots n\rbrace $ ...

  3. Linux软件安装-----apache安装

    一. ./configure --prefix=/usr/local/http2 \ --enable-modules=all \ --enble-mods-shared=all \ 开启模块共享: ...

  4. lucas定理学习

    Lucas定理是用来求 c(n,m) mod p,p为素数的值. 表达式: C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p 当我们遇到求一个N,M很大的组合数的时候,递推法就显得很耗 ...

  5. <mvc:default-servlet-handler/>的作用

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  6. IOS-SQLite数据库使用详解

    使用SQLite数据库 创建数据库 创建数据库过程需要3个步骤: 1.使用sqlite3_open函数打开数据库: 2.使用sqlite3_exec函数执行Create Table语句,创建数据库表: ...

  7. IE浏览器兼容 css之bug 问题

    bug的几种常见原因: 1.盒模型bug      原因:没有正确声明doctype(如果没有声明doctype,各浏览器对代码的解析有不同的规范).解决方法:使用严格的doctype声明. 2.各浏 ...

  8. uboot配置过程详解1

    x210_sd_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 @echo "TE ...

  9. Mac os x 下配置Intellij IDEA + Tomcat 出现权限问题的解决办法

    出现的错误提示如下: 下午9:11:27 All files are up-to-date下午9:11:27 All files are up-to-date下午9:11:27 Error runni ...

  10. 看过自会理解, Photon Server 常见概念分析.

    http://stackoverflow.com/questions/10823915/photon-server-newbie-questions/11653419#11653419 Channel ...