Mysql数据库索引创建规则[编辑]
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销,建议建立完索引后可以测试下索引是否有用到,比如用explain语句进行分析此设计的字段是否用到索引这里贴出相关文章链接进行参考(explain语句的运用)http://database.51cto.com/art/201108/284783.htm
Mysql数据库表设计优化[编辑]
1、选择正确的存储引擎 以 MySQL为例,包括有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊。 MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好,不支持事务。InnoDB 它支持“行锁” ,于是在写操作比较多的时候,会更优秀,并发性高于MyISAM支持事务特性 2、相关联的表经常频繁更新的字段不适合于冗余 3、满足数据库设计三范式 (参考下面文章) http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html 4、对于存储引擎是MyISAM的数据库,如果经常做删除和修改记录的操作,要定时执行optimize table table_name;功能对表进行碎片整理,长时间不清理导致速度变慢,占用空间大 5、字段设计尽可能的使用 NOT NULL除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL,NULL其实需要额外的空间,NULL字段的复合索引无效 6、对表进行水平划分:如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了。如果我拆成100个表,那么每个表只有10万条记录。当然这 需要数据在逻辑上可以划分。一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。比如系统界面上只提供按月查询的功能,那么把表按月 拆分成12个,每个查询只查询一个表就够了。如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了。所以一个好的拆分依据是最重要的 7、对表进行垂直划分: 有些表记录数并不多,可能也就2、3万条,但是字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能。这个时候需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系 8、少用text/blob,varchar的性能会比text高很多;实在避免不了blob,请拆表; 9、使用 ENUM 而不是 VARCHARENUM,类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。例如,性别、民族、部门和状态之类的这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR 10、用尽量少的存储空间来存数一个字段的数据;例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256),IP地址最好使用int类型;固定长度的类型最好使用char,例如:邮编;能使用tinyint就不要使用smallint,int;最好给每个字段一个默认值,最好不能为null; 11、
Mysql数据库表优化调整步骤[编辑]
1.通过show status命令了解各种SQL的执行频率 MySQL客户端连接成功后,通过使用show [session|global] status 命令可以提供服务器状态信息。其中的session来表示当前的连接的统计结果,global来表示自数据库上次启动至今的统计结果。默认是session级别的。 下面的例子:show status like ‘Com_%’; 其中Com_XXX表示XXX语句所执行的次数。 重点注意:Com_select,Com_insert,Com_update,Com_delete通过这几个参数,可以容易地了解到当前数据库的应用是以插入更新为主还是以查询操作为主,以及各类的SQL大致的执行比例是多少。 2.还有几个常用的参数便于用户了解数据库的基本情况。 Connections:试图连接MySQL服务器的次数 Uptime:服务器工作的时间(单位秒) Slow_queries:慢查询的次数 (默认是慢查询时间10s) 3.开启慢查询日志,定位慢查询 具体步骤参考如下:http://www.cnblogs.com/kerrycode/p/5593204.html 4.Explain select * from emp where ename=“zrlcHd” 会产生如下信息: select_type:表示查询的类型。 table:输出结果集的表 type:表示表的连接类型 possible_keys:表示查询时,可能使用的索引 key:表示实际使用的索引 key_len:索引字段的长度 rows:扫描出的行数(估算的行数) Extra:执行情况的描述和说明 http://database.51cto.com/art/201108/284783.htm(explain语句的运用) 5.开启mysql查询缓存
MYSQL数据库设计规范[编辑]
1.数据库命名规范:采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;命名简洁明确(长度不能超过30个字符);例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个前缀 2.数据库表名命名规范:采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;命名简洁明确,多个单词用下划线'_'分隔;例如:user_login, user_profile, user_detail表前缀'user_'可以有效的把相同关系的表显示在一起 3.数据库表字段名命名规范:采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;命名简洁明确,多个单词用下划线'_'分隔;表与表之间的相关联字段名称要求尽可能的相同; 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突 4.数据表字段的备注要填写清楚仔细便于他人阅读理解 5.数据库表索引规范:命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯一索引