占用4个字节,与INT相同,但比INT更具可读性
使用超出取值范围的类型存储
人们经常使用字符串来存储日期数据(不正确的方法)
6. 与财务相关的金额数据必须使用类型
类型为精度浮点数,计算时不会丢失精度。
占用的空间由定义的宽度决定。每4个字节可存储9位数字,小数点占1个字节。
可用于存储大于的整数数据
索引设计规范 1、限制每个表上的索引数量。建议单表使用的索引不超过5个。
索引越多越好!索引可以提高效率,但也可以降低效率。
索引可以提高查询效率,但也会降低插入和更新的效率,在某些情况下甚至会降低查询效率。
因为当MySQL优化器选择如何优化查询时,它会根据统一的信息评估每个可用的索引,以生成最佳的执行计划。如果同时有很多索引可以用于查询,这会增加MySQL优化器生成执行计划的时间,同时也会降低查询性能。
2.禁止为表中的每一列创建单独的索引
在5.6版本之前,一条SQL语句只能使用表中的一个索引。 5.6之后,虽然有了合并索引的优化方法,但还是远远不如使用联合索引查询方法。
3、每个表必须有主键
它是索引组织表:数据存储的逻辑顺序与索引的顺序相同。每个表可以有多个索引,但表只能按一种顺序存储。
该表按照主键索引的顺序组织。
常见索引列建议如何选择索引列的顺序
建立的目的是通过索引查找数据,减少随机IO,提高查询性能。索引可以过滤掉的数据越少,从磁盘读取的数据就越少。
避免创建冗余索引和重复索引(增加查询优化器生成执行计划所需的时间)。对于频繁查询,优先使用覆盖索引。
覆盖索引:是包含所有查询字段(where、by、group by 包含的字段)的索引
覆盖索引的好处:
避免对表进行二次查询以建立索引
它按照聚集索引的顺序存储。例如,二级索引在叶子节点中保存了该行的主键信息。如果使用二级索引来查询数据,找到对应的键值后,我们需要通过主键进行二级查询,以获得我们真正需要的数据。
在覆盖索引中,所有数据都可以从二级索引的键值中获取,避免了对主键的二次查询,减少了IO操作,提高了查询效率。
可以将随机IO变成顺序IO,加快查询效率
由于覆盖索引是按照键值的顺序存储的,对于IO密集型的范围搜索来说,从磁盘随机读取每行数据所需的IO要少得多。因此,覆盖索引也可以用来在磁盘上存储访问过程中的随机数据。读IO转换为顺序IO用于索引查找。
索引SET规范尽量避免使用外键约束数据库SQL开发规范1.建议使用预编译语句进行数据库操作
预编译语句可以重用这些计划,减少SQL编译所需的时间,还可以解决动态SQL带来的SQL注入问题。
只传递参数比传递SQL语句效率更高。
同一条语句可以解析一次,多次使用,提高处理效率。
2.避免数据类型的隐式转换
隐式转换会导致索引失败,例如:
select name,phone from customer where id = '111';
3.充分利用表上现有的索引
避免使用带有双% 符号的查询条件。例如:a like '3%',(如果没有前导%而只有尾随%,则可以使用列上的索引)
一条SQL只能使用复合索引中的一列进行范围查询。例如,如果a、b、c列有联合索引,并且查询条件中有a列的范围查询,则b、c列上的索引不会被使用。
定义联合索引时,如果a列需要使用范围搜索,a列必须放在联合索引的右侧,可以使用left join或not来优化not in操作,因为not in通常会导致索引失败。
4、设计数据库时应考虑未来的扩展。 5、程序连接不同的数据库,使用不同的账号进行跨库查询。 6. 禁止使用*。必须使用查询。
原因:
7、禁止使用没有字段列表的语句
喜欢:
insert into values ('a','b','c');
应该使用:
insert into t(c1,c2,c3) values ('a','b','c');
8.避免使用子查询,并将子查询优化为连接操作。
通常只有当子查询在in子句中并且子查询是简单SQL(不包括union、group by、order by、limit子句)时,才可以将子查询转换为相关查询进行优化。
子查询性能差的原因:
子查询的结果集不能使用索引。通常子查询的结果集存储在临时表中。内存临时表和磁盘临时表都没有索引,因此查询性能都会受到一定的影响。特别是对于返回较大结果集的子查询,它们对查询性能的影响会更大。
由于子查询会生成大量临时表且没有索引,因此会消耗过多的CPU和IO资源,产生大量慢查询。
9.避免使用JOIN关联太多表
对于Mysql来说,有关联的缓存,缓存的大小可以通过参数设置。
在Mysql中,同一条SQL连接多个表时,会多分配1个关联缓存。如果一条SQL关联的表越多,占用的内存就越多。
如果程序中大量使用多表关联操作,且设置不合理,很容易造成服务器内存溢出,从而影响服务器数据库性能的稳定性。
同时,对于关联操作,会发生临时表操作,影响查询效率。 Mysql最多允许关联61个表,建议不要超过5个。
10.减少与数据库的交互次数
数据库更适合处理批量操作。将多个相同的操作合并在一起可以提高处理效率。
11、对同一列进行OR判断时,用in代替or。
in的值不要超过500。in操作可以更有效地使用索引,或者大多数情况下索引很少被使用。
12.禁止使用order by rand()进行随机排序
order by rand() 会将表中所有符合条件的数据加载到内存中,然后根据随机生成的值对内存中的所有数据进行排序,并且可能会为每一行生成一个随机值。如果满足条件的话,数据集很大的话,会消耗大量的CPU、IO和内存资源。
建议在程序中获取一个随机值,然后从数据库中获取数据。
13、WHERE子句中禁止函数转换和列计算
对列进行函数转换或计算会导致索引无法使用
不推荐:
where date(create_time)='20190101'
推荐:
where create_time >= '20190101' and create_time < '20190102'
14.当明显不会有重复值时,使用UNION ALL而不是UNION ALL。将复杂的大型 SQL 拆分为多个小型 SQL 数据库。操作行为规范。超过100万行的批量写(,,)操作必须分批多次进行。操作
1、大批量操作可能会导致严重的主从延迟。
在主从环境下,大批量操作可能会导致严重的主从延迟。大容量的写操作通常需要一定的时间来执行。
只有在主库上执行完成后,才会在其他从库上执行,所以会造成主库和从库之间较长的延迟。
2. 日志为行格式时,会产生大量日志。
大批量的写入操作会产生大量的日志,尤其是行格式的二进制数据。由于每一行数据的修改都是以行格式记录的,所以我们一次修改的数据越多,产生的日志就越多。日志传输和恢复会花费更长的时间,这也是主从延迟的一个原因。
3.避免大额交易操作
大批量修改数据必须在一个事务中完成,这会导致表中大量数据被锁定,从而产生大量阻塞。阻塞会对MySQL的性能产生很大的影响。
特别是,长期阻塞会占用数据库的所有可用连接,这将阻止生产环境中的其他应用程序连接到数据库。因此,一定要注意对大型写操作进行批量处理。
对于大表,使用pt---修改表结构
修改大表的数据结构时一定要小心,因为这会导致严重的表锁操作,尤其是在生产环境中这是无法容忍的。
pt---它会先创建一个与原表结构相同的新表,修改新表上的表结构,然后将原表中的数据复制到新表中,并在原表中添加一些触发器设备。将原表中新增的数据复制到新表中。复制完所有行数据后,将新表命名为原表,并删除原表。将原来的DDL操作分解为多个小批量。
禁止对程序使用的账户授予超级权限。当程序连接数据库帐户时,遵循最小权限原则。
【结尾】
●
●
●
●
●
●
尖端
返回上一级,搜索“Java女程序员、大数据留言、书籍投递、运维算法、黑客、人工智能女友、MySQL书籍”等关键词即可获得相关文章推荐。
扫一扫在手机端查看
-
Tags : 修改字段默认值sql_Mysql高性能优化规范建议
- 上一篇:在线注册免费域名_从0-1快速开启独立站市场(一)丨注册域名相关注意事项
- 下一篇:nginx + php + mysql_最稳定的Nginx绿色环境,可无限自定义PHP和mysql版本、同时运行N个版本
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。