MYSQL数据库的设计与调优

优化思路:

1.检查数据表结构,改善不完善设计

2.跑一遍主要业务,收集常用的数据库查询SQL

3.分析查询SQL,适当拆分,添加索引等优化查询

4.优化SQL的同时,优化代码逻辑

5.添加本地缓存和redis缓存

6.增加数据库硬件配置和增加读写分离

检查数据表结构

看数据表结构设计是否合理。

尽可能不要使用NULL值

建表的时候如果不对创建的值设置默认值,MYSQL设置默认都会为NULL。

  NULL使得索引维护更加复杂,强烈建议对索引列设置NOT NULL

  NOT IN、!=等负向条件查询在有NULL值的情况下返回永远为空结果,查询容易出错。

  NULL列需要一个额外字节作为判断是否为NULL的标志位。

  使用NULL时和该列其他的值可能不是同种类型,导致问题。(在不同的语言中表现不一样)。

  MySQL难以优化为NULL的列的查询。

添加索引

对于经常查询的字段,请加上索引,有索引和没有索引的查询速度相差十倍甚至更多。

一般来说,每张表都需要有一个主键id字段常用于查询的字段应该设置索引varchar类

型的字段,在建立索引的时候,最好指定长度查询有多个条件时,优先使用具有索引

的条件像LIKE条件这样的模糊搜索对于字段索引是无效的,需要另外建立关键词索引

来解决请尽量不要在数据库层面约束表和表之间的关系,这些表之间的依赖应该在代

码层面去解决。当表和表之间有约束时,虽然增删查的SQL语句变简单了,但是带来

的负面效果是插入等操作数据库都会去检查约束(虽然可以手动设置忽略约束),这

样相当于把一些业务逻辑写到了数据库层,不便于维护。

优化表字段结构

数据库中那些可以用整形表示的数据就不要使用字符串类型,到底是用varchar还是char

要看字段的可能值。这种优化往往在数据库中有大量数据以后是不可行的,最好在数据库

设计之前就设计好。对于那些可能值很有限的列,使用tinyint代替VARCHAR,比如记录移

动设备平台,只有两个值:android,ios,那么就可以使用0表示android,1表示ios,这种

列一定要写好注释为什么不用ENUM呢?ENUM扩展困难,比如后来移动平台又增加了一

个ipad,那岂不是懵逼了,而tinyint加个2就行,而且ENUM在代码里面处理起来特别奇怪,

是当成整形呢还是字符串,各个语言不一样。这种方式,一定要在数据库注释或者代码里面

写明各个值的含义对于那些定长字符串,可以使用char,比如邮编,总是5位对于那些长度未

知的字符串,使用varchar不要滥用bigint,比如记录文章数目的表id字段,用int就行了,21亿

篇文章上限够了适当打破数据库范式添加冗余字段,避免查询时的表连接查询的时候,肯定int

类型比varchar快,因为整数的比较直接调用底层运算器就可以实现,而字符串比较要逐个字符

比较。定长数据比变长数据查询快,因为比较定长数据与数据之间的偏移是固定的,很容易计算

下一个数据的偏移。而变长数据则还需要多一步去查询下一个数据的偏移量。不过。定长数据可

能会浪费更多的存储空间。

大表拆分

对于那些数据量可能近期会超过500W或者增长很快的表,一定要提前做好垂直分表或者水平分表,

当数据量超过百万以后,查询速度会明显下降。分库分表尽量在数据库设计初期敲定方案,否则后

期会极大增加代码复杂性而且不易更改。垂直分表是按照日期等外部变量进行分表,水平分表是按

照表中的某些字段关系,使用hash映射等分表。分库分表的前提条件是在执行查询语句之前,已经

知道需要查询的数据可能会落在哪一个分库和哪一个分表中。

优化查询语句

这个才是很多系统数据库瓶颈的始作俑者。

请尽量使用简单的查询,避免使用表链接请尽量避免全表扫描,包括但不限于:where子句条件横真

或为空使用LIKE使用不等操作符(<>、!=)查询含义is null的列在非索引列上使用or多条件查询时,

请把简单查询条件或则索引列查询置于前面请尽量指定需要查询的列,不要偷懒使用select *如果不

指定,一方面会返回多余的数据,占用宽带等另一方面MySQL执行查询的时候,没有字段时会先去

查询表结构有哪些字段大些的查询关键字比小写快一点点使用子查询会创建临时表,会比链接(JOIN)

和联合(UNION)稍慢在索引字段上查询尽量不要使用数据库函数,不便于缓存查询结果当只要一行数

据时,请使用LIMIT 1,如果数据过多,请适当设定LIMIT,分页查询千万不要 ORDER BY RAND(),性

能极低。

上面是我总结的一些小tips,这些规则是死的,但是业务场景是活的,在实际使用的过程中,比如数据统计,可以适当牺牲性能换取便利。

添加缓存

使用redis等缓存,还有本地文件缓存等,可以极大地减少数据库查询次数。缓存这个东西,一定要分析自己系统的数据特点,适当选择。

对于一些常用的数据,比如配置信息等,可以放在缓存中可以在本地缓存数据库的表结构缓存的数据一定要注意及时更新,还有设置有效期增加缓存务必会增加系统复杂性,一定要注意权衡

原文地址:https://www.cnblogs.com/kangwenju/p/10632572.html

时间: 2024-11-13 23:40:05

MYSQL数据库的设计与调优的相关文章

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

DB2数据库性能监控和调优实践

1.性能调优概述 性能问题的症状 响应时间慢 吞吐量低 资源占用高(CPU.Memory.I/0等) 数据库角度 数据库逻辑设计 数据库物理设计(存储规划) SQL语句 数据库调优关键 I/O最关键 减少I/O 最大化I/O效率 存储规律,物理设计 CPU两个杀手 表扫描 排序 Memory命中率可能会骗人 SQL是一切问题的根源 2.性能调优步骤 明确问题->收集数据->分析数据->细化.定位问题->优化 3.DB2数据库监控工具-db2pd 3.1.监控工具总结 即时监控工具

MySQL 5.6初始配置调优

原文链接: What to tune in MySQL 5.6 after installation原文日期: 2013年09月17日翻译日期: 2014年06月01日翻译人员: 铁锚 随着 大量默认选项的改进, MySQL 5.6比以前版本需要调优的选项大为减少. 在本文中我将讲述需要优化的配置项. InnoDB设置 innodb_buffer_pool_size  -- 默认值为 128M. 这是最主要的优化选项,因为它指定 InnoDB 使用多少内存来加载数据和索引(data+indexe

MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优化,存储引擎的相关参数设置建议将主要在下一章“常用存储引擎的优化”中进行说明. 10.1 MySQL 安装优化 选择合适的发行版本 1. 二进制发行版(包括RPM等包装好的特定二进制版本) 由于MySQL开源的特性,不仅仅MySQL AB提供了多个平

用MySQL的optimizer_trace进行sql调优

在我们调优MySQL的SQL时候,通常使用三种工具进行查看sql执行的效率,explain.profile.optimizer_trace.前两个经常被人使用,由于第三个难度较大,大家使用的较少,下面简单说下如何使用. opitimizer_trace的使用: # 开启跟踪,默认是关闭的 SET optimizer_trace="enabled=on"; #执行你的sql语句 select .... #查看trace信息 SELECT * FROM INFORMATION_SCHEMA

Mysql千万级数据性能调优配置

背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理内存几个T,硬件参数杠杠的,然而处理这些数据踩了不少坑,因 为之前没做过这方面的工作,现在记录下清洗的过程,详细的业务清洗过程和规则均记录在https://gitee.com/yanb618/zhirong/wikis 感受: 清洗从表名,字段名,字段类型,字段值,索引创建与删除做起,每每看到那秒数

mysql 配置 文件 设置 优化 调优 解决 问题 方法 my.cnf my.ini 注释Host is not allowed to connect to this

MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下: 在Linux下叫my.cnf,该文件位于/etc/my.cnf. Host '127.0.0.1' is not allowed to connect to this MySQL server 一般原因: MySQL数据库的配置文件my.ini中设置了参数: skip-name-resolve 从而导致使用“localhost”不能连接到数据库. 解决方法: 注释掉: #skip-name-resolve 注释掉对

MYSQL企业常用架构与调优经验分享

一.选择Percona Server.MariaDB还是MYSQL 1.Mysql三种存储引擎 MySQL提供了两种存储引擎:MyISAM和 InnoDB,MySQL4和5使用默认的MyISAM存储引擎.从MYSQL5.5开始,MySQL已将默认存储引擎从MyISAM更改为InnoDB. MyISAM没有提供事务支持,而InnoDB提供了事务支持. XtraDB是InnoDB存储引擎的增强版本,被设计用来更好的使用更新计算机硬件系统的性能,同时还包含有一些在高性能环境下的新特性. 2.Perco

mysql 之my.cnf配置调优

对pre_thread_buffers优化(可以理解为每个连接到mysql的用户进程分配的内存): read_buffer_size 该参数表示表的顺序扫描,表示每个线程分配的缓冲区的大小.如在全表扫描时,会按照数据的存储顺序依次读取数据块,每次读取的数据库首先暂存在read_buffer_size中,当buffer空间被写满或者读取结束后,再将buffer中的数据返回给上层调用者,以提高效率.默认128kb,不用设置太大,一般在128~256即可. read_rnd_buffer_size 该