2022年mysql数据库的优化 .pdf

上传人:Che****ry 文档编号:34267613 上传时间:2022-08-15 格式:PDF 页数:11 大小:90.78KB
返回 下载 相关 举报
2022年mysql数据库的优化 .pdf_第1页
第1页 / 共11页
2022年mysql数据库的优化 .pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年mysql数据库的优化 .pdf》由会员分享,可在线阅读,更多相关《2022年mysql数据库的优化 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、数据库性能优化涉及到系统硬件和软件的方方面面,本文以 mysql 为例,讨论了mysql 性能优化的各个方面,包括:1. 硬件2. 操作系统 / 软件库3. SQL服务器( 设置和查询 ) 4. 应用编程接口 (API) 5. 应用程序一、优化硬件如果你需要庞大的数据库表(2G), 你应该考虑使用 64位的硬件结构,像 Alpha、Sparc、IA64。因为 MySQL 内部使用大量 64位的整数, 64 位的 CPU将提供更好的性能。对大数据库,优化的次序一般是RAM 、快速硬盘、 CPU 能力。更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。如果不使用事务安全 (trans

2、action-safe)的表或有大表并且想避免长文件检查,一台 UPS就能够在电源故障时让系统安全关闭。对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量同样重要。二、优化磁盘为系统、程序和临时文件配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。低寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log( 行数)/log(索引块长度 /3*2/(键码长度 + 数据指针长度 )+1 次寻到才能找到一行。对于有 500000 行的表,索引 Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 +

3、2)+1=4次寻道。上述索引需要500000*7*3/2=5.2M 的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。然而对于写入 (如上),你将需要 4 次寻道请求来找到在哪里存放新键码,而且一般要 2 次寻道来更新索引并写入一行。对于非常大的数据库, 你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈 N log N数据级递增。将数据库和表分在不同的磁盘上。在MySQL 中,你可以为此而使用符号链接。条列磁盘 (RAID 0) 将提高读和写的吞吐量。带镜像的条列 (RAID 0+1) 将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。不要对临时文件或可以很容易地重建的数据所

4、在的磁盘使用镜像或RAID(除了RAID 0) 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 在 Linux 上, 在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和 DMA 功能。这可以将响应时间提高550% 。在 Linux 上,用 async ( 默认)和 noatime 挂载磁盘 (mount) 。对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。三、优化操作系统不要交换区。如

5、果内存不足,增加更多的内存或配置你的系统使用较少内存。不要使用 NFS磁盘(会有 NFS锁定的问题 ) 。增加系统和 MySQL 服务器的打开文件数量。 ( 在 safe_mysqld 脚本中加入ulimit -n #)。增加系统的进程和线程数量。如果你有相对较少的大表,告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。使用支持大文件的文件系统(Solaris)。选择使用哪种文件系统。在Linux 上的 Reiserfs对于打开、读写都非常快。文件检查只需几秒种。四、选择应用编程接口PERL 可在不同的操作系统和数据库之间移植。适宜快速原型。应该使用 DBI/DBD接口。PHP 比

6、PERL易学。使用比 PERL少的资源。通过升级到 PHP5可以获得更快的速度。C MySQL 的原生接口。较快并赋予更多的控制。低层,所以必须付出更多。C+ 较高层次,给你更多的时间来编写应用。仍在开发中ODBC 运行在 Windows和 Unix 上。几乎可在不同的 SQL服务器间移植。较慢。 MyODBC 只是简单的直通驱动程序,比用原生接口慢19% 。有很多方法做同样的事。很难像很多ODBC 驱动程序那样运行,在不同的领域还有不同的错误。问题成堆。 Microsoft偶尔还会改变接口。不明朗的未来。 (Microsoft更推崇 OLE而非 ODBC) ODBC 运行在 Windows和

7、 Unix 上。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 几乎可在不同的 SQL服务器间移植。较慢。 MyODBC 只是简单的直通驱动程序,比用原生接口慢19% 。有很多方法做同样的事。很难像很多ODBC 驱动程序那样运行,在不同的领域还有不同的错误。问题成堆。 Microsoft偶尔还会改变接口。不明朗的未来。 (Microsoft更推崇 OLE而非 ODBC) JDBC 理论上可在不同的操作系统何时据库间移植。可以运

8、行在 web客户端。Python 和其他可能不错,可我们不用它们。五、优化应用应该集中精力解决问题。在编写应用时,应该决定什么是最重要的:1、速度2、操作系统间的可移植性3、SQL服务器间的可移植性4、使用持续的连接。5、缓存应用中的数据以减少SQL服务器的负载。6、不要查询应用中不需要的列。7、不要使用 SELECT * FROM table_name,8、测试应用的所有部分,但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。 通过以一种模块化的方式进行,你应该能用一个快速“哑模块”替代找到的瓶颈,然后很容易地标出下一个瓶颈。9、 如果在一个批处理中进行大量修改,使用 LOCK TA

9、BLES 。 例如将多个 UPDATES或 DELETES 集中在一起。六、如果你需要更快的速度,你应该:1、找出瓶颈 (CPU 、磁盘、内存、 SQL服务器、操作系统、 API 或应用 )并集中全力解决。2、使用给予你更快速度 / 灵活性的扩展。3、 逐渐了解 SQL 服务器以便能为你的问题使用可能最快的SQL 构造并避免瓶颈。4、优化表布局和查询。5、使用复制以获得更快的选择(select)速度。6、如果你有一个慢速的网络连接数据库,使用压缩客户/ 服务器协议。7、不要害怕时应用的第一个版本不能完美地移植,在你解决问题时,你总是可以在以后优化它。七、优化 MySQL 名师资料总结 - -

10、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 1、挑选编译器和编译选项,为你的系统寻找最好的启动选项。2、通读 MySQL 参考手册并阅读 Paul DuBios的MySQL 一书。 (已有中文版 -译注) 3、多用 EXPLAIN SELECT 、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST了解查询优化器的工作原理。优化表的格式。4、维护你的表 (myisamchk、CHECK TABLE 、 OPTI

11、MIZE TABLE) 5、使用 MySQL 的扩展功能以让一切快速完成。6、如果你注意到了你将在很多场合需要某些函数,编写MySQL UDF 函数。7、不要使用表级或列级的GRANT,除非你确实需要。八、编译和安装MySQL 通过为你的系统挑选可能最好的编译器,你通常可以获得10-30% 的性能提高。在 Linux/Intel平台上,用 pgcc(gcc 的奔腾芯片优化版 ) 编译 MySQL 。然而,二进制代码将只能运行在Intel奔腾 CPU 上。对于一种特定的平台,使用MySQL 参考手册上推荐的优化选项。一般地,对特定 CPU 的原生编译器 (如 Sparc 的 Sun Worksh

12、op) 应该比 gcc 提供更好的性能,但不总是这样。用你将使用的字符集编译MySQL 。静态编译生成 mysqld 的执行文件 ( 用with-mysqld-ldflags=all-static)并用strip sql/mysqld整理最终的执行文件。注意,既然 MySQL 不使用 C+ 扩展,不带扩展支持编译MySQL 将赢得巨大的性能提高。如果操作系统支持 原生线程,使用原生线程( 而不用 mit-pthreads)。用 MySQL 基准测试来测试最终的二进制代码。九、维护如果可能,偶尔运行一下OPTIMIZE table ,这对大量更新的变长行非常重要。偶尔用 myisamchk -a

13、 更新一下表中的 键码分布统 计。 记住在做之前关掉MySQL 。如果有碎片文件, 可能值得将所有文件复制到另一个磁盘上,清除原来的磁盘并拷回文件。如果遇到问题,用myisamchk或 CHECK table 检查表。用 mysqladmin -i10 precesslist extended-status监控 MySQL 的状态。用 MySQL GUI客户程序,你可以在不同的窗口内监控进程列表和状态。使用 mysqladmin debug 获得有关锁定和性能的信息。十、优化 SQL 扬 SQL之长,其它事情交由应用去做。使用SQL服务器来做:找出基于 WHERE 子句的行: JOIN 表、G

14、ROUP BY 、ORDER BY 、DISTINCT 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 不要使用 SQL来做:检验数据 ( 如日期 ) 成为一只计算器,技巧:明智地使用键码。键码适合搜索,但不适合索引列的插入/ 更新。保持数据为数据库第三范式,但不要担心冗余信息或这如果你需要更快的速度,创建总结表。在大表上不做 GROUP BY ,相反创建大表的总结表并查询它。UPDATE table set count=c

15、ount+1 where key_column=constant非常快。对于大表,或许最好偶尔生成总结表而不是一直保持总结表。充分利用 INSERT的默认值。十一、重要的 MySQL 启动选项back_log 如果需要大量新连接,修改它。thread_cache_size如果需要大量新连接,修改它。key_buffer_size 索引页池,可以设成很大。bdb_cache_size BDB表使用的记录和键吗高速缓存。table_cache 如果有很多的表和并发连接,修改它。delay_key_write如果需要缓存所有键码写入,设置它。log_slow_queries找出需花大量时间的查询。m

16、ax_heap_table_size 用于 GROUP BY sort_buffer 用于 ORDER BY 和 GROUP BY myisam_sort_buffer_size用于 REPAIR TABLE join_buffer_size在进行无键吗的联结时使用。十二、优化表MySQL 拥有一套丰富的类型。你应该对每一列尝试使用最有效的类型。ANALYSE 过程 可以帮助你找到表的最优类型:SELECT * FROM table_name PROCEDURE ANALYSE() 。对于不保存 NULL值的列使用 NOT NULL ,这对你想索引的列尤其重要。将 ISAM类型的表改为 MyI

17、SAM 。如果可能,用固定的表格式创建表。不要索引你不想用的东西。利用 MySQL 能按一个索引的前缀进行查询的事实。如果你有索引INDEX(a,b) ,你不需要在 a 上的索引。不在长 CHAR/VARCHAR列上创建索引,而只索引列的一个前缀以节省存储空间。CREATE TABLE table_name (hostname CHAR(255) not null, index(hostname(10) 对每个表使用最有效的表格式。在不同表中保存相同信息的列应该有同样的定义并具有相同的列名。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -

18、 - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 十三、 MySQL 如何次存储数据数据库以目录存储。表以文件存储。列以变长或定长格式存储在文件中。对BDB 表,数据以页面形式存储。支持基于内存的表。数据库和表可在不同的磁盘上用符号连接起来。在 Windows上,MySQL 支持用 .sym 文件内部符号连接数据库。十四、 MySQL 表类型HEAP 表:固定行长的表,只存储在内存中并用HASH 索引进行索引。ISAM表:MySQL 3.22中的早期 B-tree表格式 。MyIASM :IASM表的新版本,有如下扩展:1. 二进

19、制层次的可移植性。2. NULL列索引。3. 对变长行比 ISAM表有更少的碎片。4. 支持大文件。5. 更好的索引压缩。6. 更好的键吗统计分布。7. 更好和更快的 auto_increment处理。来自 Sleepcat 的 Berkeley DB(BDB) 表:事务安全 ( 有 BEGIN WORK/COMMIT|ROLLBACK)。十五、 MySQL 行类型(专指 IASM/MyIASM 表)如果所有列是定长格式 ( 没有 VARCHAR、BLOB 或 TEXT),MySQL 将以定长表格式创建表,否则表以动态长度格式创建。定长格式比动态长度格式快很多并更安全。动态长度行格式一般占用较

20、少的存储空间,但如果表频繁更新,会产生碎片。在某些情况下,不值得将所有VARCHAR、BLOB 和 TEXT列转移到另一个表中,只是获得主表上的更快速度。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 利用 myiasmchk(对 ISAM ,pack_iasm),可以创建只读压缩表,这使磁盘使用率最小,但使用慢速磁盘时, 这非常不错。 压缩表充分地利用将不再更新的日志表十六、 MySQL 高速缓存(所有线程共享,一次性分配)

21、键码缓存: key_buffer_size,默认 8M 。表缓存: table_cache ,默认 64。线程缓存: thread_cache_size ,默认 0。主机名缓存:可在编译时修改,默认128。内存映射表:目前仅用于压缩表。注意: MySQL 没有行高速缓存,而让操作系统处理。十七、 MySQL 缓存区变量(非共享,按需分配)sort_buffer:ORDER BY/GROUP BY record_buffer:扫描表。join_buffer_size:无键联结myisam_sort_buffer_size:REPAIR TABLE net_buffer_length:对于读 SQ

22、L语句并缓存结果。tmp_table_size:临时结果的 HEAP 表大小。十八、 MySQL 表高速缓存工作原理每个 MyISAM 表的打开实例 (instance)使用一个索引文件和一个数据文件。如果表被两个线程使用或在同一条查询中使用两次,MyIASM 将共享索引文件而是打开数据文件的另一个实例。如果所有在高速缓存中的表都在使用,缓存将临时增加到比表缓存尺寸大些。如果是这样,下一个被释放的表将被关闭。你可以通过检查 mysqld 的 Opened_tables 变量以检查表缓存是否太小。如果该值太高,你应该增大表高速缓存。名师资料总结 - - -精品资料欢迎下载 - - - - - -

23、 - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 十九、 MySQL 扩展/ 优化- 提供更快的速度使用优化的表类型( HEAP 、MyIASM 或 BDB表)。对数据使用优化的列。如果可能使用定长行。使用不同的锁定类型( SELECT HIGH_PRIORITY,INSERT LOW_PRIORITY)Auto_increment REPLACE (REPLACE INTO table_na me VALUES (,)INSERT DELAYED LOAD DATA INFILE / LO

24、AD_FILE() 使用多行 INSERT一次插入多行。SELECT INTO OUTFILE LEFT JOIN, STRAIGHT JOIN LEFT JOIN ,结合 IS NULLORDER BY 可在某些情况下使用键码。如果只查询在一个索引中的列,将只使用索引树解决查询。联结一般比子查询快(对大多数SQL服务器亦如此)。LIMIT SELECT * from table1 WHERE a 10 LIMIT 10,20 DELETE * from table1 WHERE a 10 LIMIT 10 foo IN (常数列表 ) 高度优化。GET_LOCK()/RELEASE_LOCK

25、() LOCK TABLES INSERT和 SELECT 可同时运行。UDF函数可装载进一个正在运行的服务器。压缩只读表。CREATE TEMPORARY TABLE CREATE TABLE . SELECT 带 RAID选项的 MyIASM 表将文件分割成很多文件以突破某些文件系统的2G限制。Delay_keys 复制功能二十、 MySQL 何时使用索引对一个键码使用 , =, =, 1 and key_part1 explain select t3.DateOfAction, t1.TransactionID - from t1 join t2 join t3 - where t2.I

26、D = t1.TransactionID and t3.ID = t2.GroupID - order by t3.DateOfAction, t1.TransactionID; +-+ + + + + + + | table | type | possible_keys | key | key_len | ref | rows | Extra | +-+ + + + + + + | t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort | | t2 | ref | ID | ID | 4 | t

27、1.TransactionID | 13 | | | t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | | +-+ + + + + + + ALL和范围类型提示一个潜在的问题。二十二、学会使用SHOW PROCESSLIST使用 SHOW processlist 来发现正在做什么:+-+-+ +-+ + +-+ | Id | User | Host | db | Command | Time | State | Info | +-+-+ +-+ + +-+ | 6 | monty | localhost | bp | Query |

28、15 | Sending data | select * from station,station as s1 | | 8 | monty | localhost | | Query | 0 | | show processlist | +-+-+ +-+ + +-+ 在 mysql 或 mysqladmin 中用 KILL 来杀死溜掉的线程。二十三、如何知晓MySQL 解决一条查询运行项列命令并试图弄明白其输出:SHOW VARIABLES; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -

29、 - 第 9 页,共 11 页 - - - - - - - - - SHOW COLUMNS FROM ,GEXPLAIN SELECT ,GFLUSH STATUS; SELECT ,;SHOW STATUS; 二十四、 MySQL 非常不错日志在进行很多连接时,连接非常快。同时使用 SELECT 和 INSERT的场合。在不把更新与耗时太长的选择结合时。在大多数选择 / 更新使用唯一键码时。在使用没有长时间冲突锁定的多个表时。在用大表时 (MySQL 使用一个非常紧凑的表格式) 。二十五、 MySQL 应避免的事情用删掉的行更新或插入表,结合要耗时长的SELECT 。在能放在 WHERE

30、子句中的列上用 HAVING 。不使用键码或键码不够唯一而进行JOIN。在不同列类型的列上JOIN。在不使用 =匹配整个键码时使用HEAP 表。在 MySQL 监控程序中忘记在 UPDATE 或 DELETE 中使用一条 WHERE 子句。如果想这样做,使用 mysql 客户程序的 i-am-a-dummy 选项。二十六、 MySQL 各种锁定内部表锁定LOCK TABLES(所有表类型适用)GET LOCK()/RELEASE LOCK() 页面锁定(对 BDB表)ALTER TABLE 也在 BDB 表上进行表锁定LOCK TABLES 允许一个表有多个读者和一个写者。一般 WHERE 锁

31、定具有比 READ 锁定高的优先级以避免让写入方干等。对于不重要的写入方,可以使用LOW_PRIORITY 关键字让锁定处理器优选读取方。UPDATE LOW_PRIORITY SET value=10 WHERE id=10; 二十七、给 MySQL 更多信息以更好地解决问题的技巧注意你总能去掉 (加注释 )MySQL 功能以使查询可移植:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - SELECT /*! SQL_BUF

32、FER_RESULTS */ ,SELECT SQL_BUFFER_RESULTS ,将强制 MySQL 生成一个临时结果集。 只要所有临时结果集生成后, 所有表上的锁定均被释放。这能在遇到表锁定问题时或要花很长时间将结果传给客户端时有所帮助。SELECT SQL_SMALL_RESULT , GROUP BY ,告诉优化器结果集将只包含很少的行。SELECT SQL_BIG_RESULT , GROUP BY ,告诉优化器结果集将包含很多行。SELECT STRAIGHT_JOIN ,强制优化器以出现在FROM 子句中的次序联结表。SELECT , FROM table_name USE INDEX (index_list) | IGNORE INDEX (index_list) table_name2 强制 MySQL 使用/ 忽略列出的索引。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁