MySql数据库优化集锦一

MySql数据库优化集锦一

Mysql设计优化

1存储引擎的选择
Myisam:数据库并发不大,读多写少,而且都能很好的用到索引,sql语句比较简单的应用,TB数据仓库
Innodb:并发访问大,写操作比较多,有外键、事务等需求的应用,系统内存较大。

2命名规则
多数开发语言命名规则:比如MyAdress
多数开源思想命名规则:my_address
避免随便命名

3字段类型选择
字段类型的选择的一般原则:
根据需求选择合适的字段类型,在满足需求的情况下字段类型尽可能小。
只分配满足需求的最小字符数,不要太慷慨。
原因:更小的字段类型更小的字符数占用更少的内存,占用更少的磁盘空间,占用更少的磁盘IO,以及占用更少的带宽。

对于varchar和char的选择要根据引擎和具体情况的不同来选择,主要依据如下原则:
1.如果列数据项的大小一致或者相差不大,则使用char。
2.如果列数据项的大小差异相当大,则使用varchar。
3.对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间。
4.对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。
事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利。
5.表中只要存在一个varchar类型的字段,那么所有的char字段都会自动变成varchar类型,因此建议定长和变长的数据分开。

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

5主键选择原则
注:这里说的主键设计主要是针对INNODB引擎
1.能唯一的表示行。
2.显式的定义一个数值类型自增字段的主键,这个字段可以仅用于做主键,不做其他用途。
3.MySQL主键应该是单列的,以便提高连接和筛选操作的效率。
4.主键字段类型尽可能小,能用SMALLINT就不用INT,能用INT就不用BIGINT。
5.尽量保证不对主键字段进行更新修改,防止主键字段发生变化,引发数据存储碎片,降低IO性能。
6.MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
7.MySQL主键应当有计算机自动生成。
8.主键字段放在数据表的第一顺序。
推荐采用数值类型做主键并采用auto_increment属性让其自动增长。

6其他需要注意的地方
NULL OR NOT NULL
尽可能设置每个字段为NOT NULL,除非有特殊的需求,原因如下:
1.使用含有NULL列做索引的话会占用更多的磁盘空间,因为索引NULL列需要额外的空间来保存。
2.进行比较的时候,程序会更复杂。
3.含有NULL的列比较特殊,SQL难优化,如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。

文件、图片等大文件用文件系统存储,不用数据库
不用多说,铁律!!!数据库只存储路径。

优化你的MySQL查询缓存
在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一。当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的。

索引
索引的缺点:极大地加速了查询,减少扫描和锁定的数据行数。
索引的缺点:占用磁盘空间,减慢了数据更新速度,增加了磁盘IO。

添加索引有如下原则:
1.选择唯一性索引。
2.为经常需要排序、分组和联合操作的字段建立索引。
3.为常作为查询条件的字段建立索引。
4.限制索引的数据,索引不是越多越好。
5.尽量使用数据量少的索引,对于大字段可以考虑前缀索引。
6.删除不再使用或者很少使用的索引。
7.结合核心SQL优先考虑覆盖索引。
8.忌用字符串做主键。

反范式设计
适当的使用冗余的反范式设计,以空间换时间有的时候会很高效。

Mysql软件优化

开启mysql复制,实现读写分离、负载均衡,将读的负载分摊到多个从服务器上,提高服务器的处理能力。
使用推荐的GA版本,提升性能
利用分区新功能进行大数据的数据拆分

Mysql配置优化

注意:全局参数一经设置,随服务器启动预占用资源。

key_buffer_size参数
mysql索引缓冲,如果是采用myisam的话要重点设置这个参数,根据(key_reads/key_read_requests)判断

innodb_buffer_pool_size参数
INNODB 数据、索引、日志缓冲最重要的引擎参数,根据(hit riatos和FILE I/O)判断

wait_time_out参数
线程连接的超时时间,尽量不要设置很大,推荐10s

max_connections参数
服务器允许的最大连接数,尽量不要设置太大,因为设置太大的话容易导致内存溢出

thread_concurrency参数
线程并发利用数量,(cpu+disk)*2,根据(os中显示的请求队列和tickets)判断

sort_buffer_size参数
获得更快的–ORDER BY,GROUP BY,SELECT DISTINCT,UNION DISTINCT

read_rnd_buffer_size参数
当根据键进行分类操作时获得更快的–ORDER BY

join_buffer_size参数
join连接使用全表扫描连接的缓冲大小,根据select_full_join判断

read_buffer_size参数
全表扫描时为查询预留的缓冲大小,根据select_scan判断

tmp_table_size参数
临时内存表的设置,如果超过设置就会转化成磁盘表,根据参数(created_tmp_disk_tables)判断

innodb_log_file_size参数(默认5M)
记录INNODB引擎的redo log文件,设置较大的值意味着较长的恢复时间。

innodb_flush_method参数(默认fdatasync)
Linux系统可以使用O_DIRECT处理数据文件,避免OS级别的cache,O_DIRECT模式提高数据文件和日志文件的IO提交性能

innodb_flush_log_at_trx_commit(默认1)
1.0表示每秒进行一次log写入cache,并flush log到磁盘。
2.1表示在每次事务提交后执行log写入cache,并flush log到磁盘。
3.2表示在每次事务提交后,执行log数据写入到cache,每秒执行一次flush log到磁盘。

Mysql语句级优化

1.性能查的读语句,在innodb中统计行数,建议另外弄一张统计表,采用myisam,定期做统计.一般的对统计的数据不会要求太精准的情况下适用。
2.尽量不要在数据库中做运算。
3.避免负向查询和%前缀模糊查询。
4.不在索引列做运算或者使用函数。
5.不要在生产环境程序中使用select * from 的形式查询数据。只查询需要使用的列。
6.查询尽可能使用limit减少返回的行数,减少数据传输时间和带宽浪费。
7.where子句尽可能对查询列使用函数,因为对查询列使用函数用不到索引。
8.避免隐式类型转换,例如字符型一定要用’’,数字型一定不要使用’’。
9.所有的SQL关键词用大写,养成良好的习惯,避免SQL语句重复编译造成系统资源的浪费。
10.联表查询的时候,记得把小结果集放在前面,遵循小结果集驱动大结果集的原则。
11.开启慢查询,定期用explain优化慢查询中的SQL语句。
使用EXPLAIN关键字是另一个MySQL优化技巧,可以让你了解MySQL正在进行什么样的查询操作,这可以帮助你发现瓶颈的所在,并显示出查询或表结构在哪里出了问题。
EXPLAIN查询的结果,可以告诉你那些索引正在被引用,表是如何被扫描和排序的等等。
实 现一个SELECT查询(最好是比较复杂的一个,带joins方式的),在里面添加上你的关键词解释,在这里我们可以使用phpMyAdmin,他会告诉 你表中的结果。举例来说,假如当我在执行joins时,正忘记往一个索引中添加列,EXPLAIN能帮助我找到问题的所在。
添加索引到group_id field后

12.保证连接的索引是相同的类型
如果应用程序中包含多个连接查询,你需要确保你链接的列在两边的表上都被索引。这会影响MySQL如何优化内部联接操作。
此外,加入的列,必须是同一类型。例如,你加入一个DECIMAL列,而同时加入另一个表中的int列,MySQL将无法使用其中至少一个指标。即使字符编码必须同为字符串类型。
// looking for companies in my state
// both state columns should be indexed and they both should be the same type and character encoding or MySQL might do full table scans
$r = mysql_query(“SELECT company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = $user_id”);

郑重声明:

1 本资源来源于互联网,资源的版权归资源原作者所持有,受《中华人民共和国著作权法》等相关法律保护。

2 由于无法和原作者取得联系,所以上传的部分资源无法先通过原作者的同意就分享给大家了,如本资源侵犯了您(原作者)的权益,请联系我们(微信号 xiaohaimei1989),我们会立马删除您的资源,并向您表达诚挚的歉意!

3 本站是一个公益型网站,分享资源的目的在于传播知识,分享知识,收取一点点打赏的辛苦费是用于网站的日常运营开支,并非用于商业用途。

4 本站资源只提供学习和参考研究使用,使用过后请在第一时间内删除。本站不承担资源被单位或个人商用带来的法律责任。

发表评论