首页 > 编程知识 正文

程序员跳槽指南,如何提高sql语句编写能力

时间:2023-05-05 06:32:42 阅读:143727 作者:1879

MySQL数据库优化通常包括四个维度:硬件、系统配置、数据库表结构、SQL和索引。

从优化成本看,硬件系统与数据库表结构的SQL构成索引。 从优化效果看,硬件系统与数据库表结构SQL构成索引。 要优化MySQL,您需要知道如何在MySQL的组件之间进行协作,以及MySQL如何优化和执行查询。

MySQL逻辑架构

MySQL逻辑体系结构总体上分为三层,顶层是客户端层,而不仅仅是MySQL。 例如,连接处理、许可证认证、安全等功能在此层处理。

MySQL的大多数核心服务位于中间层,包括查询分析、分析、优化、缓存、内置函数(时间、数学、加密等函数)。 此层次还实现了所有存储引擎之间的功能,包括存储过程、触发器和视图。

底层是存储引擎,负责存储和提取MySQL中的数据。 与Linux上的文件系统一样,每个存储引擎都有其优势和劣势。 中间的服务层通过API与存储引擎进行通信,这些API接口隐藏不同存储引擎之间的差异。

MySQL查询过程

客户端向服务器发送查询。

服务器首先检查查询缓存,如果遇到缓存,则立即返回缓存中存储的结果。 否则,进入下一个阶段。

服务器进行SQL分析.预处理,优化程序生成对应的执行计划。

MySQL根据优化程序生成的执行计划,调用存储引擎的API执行查询。

将结果返回给客户端。

关于查询缓存的说明:

在分析查询语句之前,如果高速缓存处于打开状态,MySQL将优先检查查询是否命中查询高速缓存中的数据。

如果没有命中,则进入下一阶段的处理。

如果遇到查询缓存,则会检查用户的权限。

如果权限满意,MySQL会跳过其他阶段,直接将数据返回给客户端。

在此,从硬件、系统结构、表设计、sql语句等方面优化MySQL。

硬件优化CPU :选择多核CPU、主频CPU。 内存:选择更大的内存。 磁盘:选择更高的转速、RAID或阵列卡,或在条件允许时使用固态硬盘。 网络环境:尽量布置在局域网中,使用光缆、千/万兆网等提供网络,通过双网络线路提供冗馀,使用多端口绑定监听。 优化系统配置优化操作系统配置使用64位操作系统,更好地使用大内存。 优化内核参数。 加大文件描述符的限制。 选择文件系统: XFS、JFS、EXT3/EXT4(选择文件系统对确保数据安全至关重要。 Mysql软件优化为打开mysql复制,实现读写分离、负载均衡,将读的负载分摊到多个从服务器上,从而提高服务器的处理能力。 使用推荐的正式发布版本(正式发布的版本)提高性能。 利用分区的新功能进行大数据的数据分割。 Mysql配置优化注:设置全局参数后,请单击随服务器启动预占用资源。

wait_time_out参数:线程连接的超时时间不应设置为尽可能大。 推荐10s。 thread_concurrency参数:线程并发次数。 在5.7.2版的mysql中被删除了。 在InnoDB中,可以通过设置innodb_thread_concurrency参数来限制线程数。innodb_thread_concurrency的使用建议

官方文件还对innodb_thread_concurrency的使用提出了以下建议。

如果工作负载的并发用户线程数小于64,建议设置innodb_thread_concurrency=0。

如果工作负载一直很严重且偶尔达到峰值,可以首先设置innodb_thread_concurrency=128,然后不断降低此参数、96、80、64等以提供最佳性能例如,假设系统中通常有40~50个用户,但定期增加到60,70个。在设置80个并发用户时,性能可能会变得稳定,否则性能反而会下降。 在这种情况下,建议将innodb_thread_concurrency参数设置为80,以避免影响性能。

read_buffer_size参数: select_scan确定在所有表扫描期间为查询保留的缓冲区大小。 tmp_table_size参数:临时内存表的设置,如果超过设置就会转化成磁盘表,参数(created_tmp_disk_tables )来确定。 选择Mysql表设计优化存储引擎Myisam :适用于并发量少、读写少、索引使用好、sql语句相对简单的APP,如数据仓库。 Innodb :并发访问大,写入操作多,有外键、事务等

需求的应用,系统内存较大。命名规则 采用多数开发语言命名规则,比如MyAdress(驼峰原则)采用多数开源思想命名规则,比如my_address,通常采用下划线这种命名规则。避免随便命名,最好能够见名知意。字段类型选择

根据需求选择合适的字段类型,在满足需求的情况下字段类型尽可能小。只分配满足需求的最小字符数,不要太慷慨。

原因:更小的字段类型和更小的字符数将占用更少的内存,占用更少的磁盘空间,占用更少的磁盘IO,以及占用更少的带宽。

编码选择 单字节-latin1多字节-utf8(汉字占3个字节,英文字母占用一个字节)如果含有中文字符的话最好都统一采用utf8类型,避免乱码的情况发生。主键选择

注:这里说的主键设计主要是针对INNODB引擎。

能唯一的表示行。显式的定义一个数值类型自增字段的主键,这个字段可以仅用于做主键,不做其他用途。MySQL主键应该是单列的,以便提高连接和筛选操作的效率。主键字段类型尽可能小,能用SMALLINT就不用INT,能用INT就不用BIGINT。尽量保证不对主键字段进行更新修改,防止主键字段发生变化,引发数据存储碎片,降低IO性能。MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。MySQL主键应当由自动生成。主键字段放在数据表的第一顺序

通常,我们推荐采用数值类型做主键并采用auto_increment属性让其自动增长。

Mysql语句层面优化 性能差的读语句,在innodb中统计行数,建议另外弄一张统计表,采用myisam,定期做统计。一般对统计的数据不会要求太精准的情况下适用。尽量不要在数据库中做运算。避免 负向查询%前缀模糊查询。不在索引列做运算或者使用函数。不要在生产环境程序中使用select * from的形式查询数据。只查询需要使用的列。查询时,尽可能使用limit减少返回的行数,减少数据传输时间和带宽浪费。where子句尽可能避免对查询列使用函数,因为对查询列使用函数用不到索引。避免隐式类型转换,例如字符型一定要用’’,数字型一定不要使用’’。所有的SQL关键词用大写,养成良好的习惯,避免SQL语句重复编译造成系统资源的浪费。联表查询的时候,记得把小结果集放在前面,遵循小结果集驱动大结果集的原则。开启慢查询,定期用explain优化慢查询中的SQL语句。拆分大的delete或insert语句。总结

从上面看出,MYSQL主要从以下几方面进行优化:

表设计:合理的存储引擎,字段类型,范式与逆范式功能:合适的索引,缓存,分区分表。架构:采用主从复制,读写分离,负载均衡。合理SQL:测试及对比同一功能不同sql的查询效率,根据过往的经验编写高效的sql。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。