赞
踩
InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。
分区表在物理上表现为多个文件,在逻辑上表现为一个表;
谨慎选择分区键,跨分区查询效率可能更低;
建议采用物理分表的方式管理大数据。
避免更多的关联操作。
在数据库中存储文件会严重影响数据库性能,消耗过多存储空间。
文件(比如图片)这类大的二进制数据通常存储于文件服务器,数据库只存储文件地址信息。
进行查询时需要对多张表进行关联查询,有时为了提高查询效率,会降低范式的要求,在表中保存一定的冗余信息,也叫做反范式。但要注意反范式一定要适度。
存储字节越小,占用也就空间越小,性能也越好。
比如可以将 IP 地址转换成整型数据。
MySQL 提供了两个方法来处理 ip 地址
INET_ATON() :
插入数据前,把 ip 转为无符号整型 (4-8 位)
INET_NTOA() :
查询数据后,把整型的 ip 转为地址
如自增 ID,整型 IP,年龄
因为无符号相对于有符号可以多出一倍的存储空间
比如年龄、状态表示如 0/1

若主键为自增 id,每次都会将数据加在 B+树尾部(本质是双向链表),时间复杂度为 O(1)。
在写满一个数据页的时候,直接申请另一个新数据页接着写就可以了。
若主键是非自增 id,为了让新加入数据后 B+树的叶子节点还能保持有序,它就需要往叶子结点的中间找,查找过程的时间复杂度是 O(lgn)。
如果这个也被写满的话,就需要进行页分裂。页分裂操作需要加悲观锁,性能非常低。
备注: 分库分表不建议使用自增 id 作为主键,应该使用分布式 ID 比如 uuid。
最常见的 TEXT 类型可以存储 64k 的数据
除非有特别的原因使用 NULL 值
如果一个表包含过多字段的话,可以考虑将其分解成多个表,必要时增加中间表进行关联。
关于覆盖索引链接:
Mysql性能优化:为什么要用覆盖索引?
隐式转换会导致索引失效如:
// 等号左边id在数据库里是数值型,而等号右边却给了字符型,就会发生隐式转换
select name,phone from customer where id = '111';
转化条件
通常子查询在 in 子句中,且子查询中为简单 SQL(不包含 union、group by、order by、limit 从句) 时,才可以把子查询转化为关联查询进行优化。
子查询性能差原因
对列进行函数转换或计算时会导致无法使用索引
// 不推荐
where date(create_time)='20190101'
// 推荐
where create_time >= '20190101' and create_time < '20190102'
备注: 推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。
in 的值不要超过 500 个,in 操作可以更有效的利用索引,or 大多数情况下很少能利用到索引。
分页在数据量小时耗费时间短,但百万甚至千万级别耗费时间就长了。
// 百万数据量查询
SELECT `score`,`name` FROM `cus_order` ORDER BY `score` DESC LIMIT 1000000, 10
// 子查询:我们先查询出 limit 第一个参数对应的主键值,再根据这个主键值再去过滤并 limit,这样效
率会更快(阿里巴巴规范)
SELECT `score`,`name` FROM `cus_order` WHERE id >= (SELECT id FROM `cus_order` LIMIT 1000000,1) LIMIT 10
备注: 子查询的结果会产生一张新表会影响性能,尽量避免大量使用子查询。
我们先提取对应的主键,再将这个主键表与原数据表关联:
SELECT `score`,`name` FROM `cus_order` a, (SELECT id from `cus_order` ORDER BY `score` DESC LIMIT 1000000, 10) b where a.id = b.id
相关详细链接如下:
Join的效率比较低,因为其使用嵌套循环(Nested Loop)来实现关联查询,三
种不同的实现效率都不是很高:
建议使用这种方法,因为:
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
除非数据需要去重
UNION 会把两个结果集的所有数据放到临时表中后再进行去重操作,更耗时,更消耗 CPU资源。
UNION ALL 不会再对结果集进行去重操作,获取到的数据包含重复的项。
展示SQL语句的资源使用情况:CPU使用、CPU 上下文切换、IO 等待、内存使用等。
// 查询功能是否存在、打开 SHOW VARIABLES LIKE '%profiling%' 或者: SELECT @@profiling // 设置打开 SET @@profiling=1 // 设置展示SQL语句数量(如下设置100条) SET @@profiling_history_size=100 // 查询所有SQL的QUERY_ID SHOW PROFILE // 根据QUERY_ID(如下为8)对应的SQL语句性能 SHOW PROFILE CPU,IPC, MEMORY FOR QUERY 8;
分析信息:
select_type :查询的类型,常用的取值有 SIMPLE(普通查询,即没有联合查询、
子查询)、PRIMARY(主查询)、UNION(UNION 中后面的查询)、SUBQUERY(子
查询)等。
table :表示查询涉及的表或衍生表。
type :执行方式,判断查询是否高效的重要参考指标,结果值从差到好依次是:ALL
< index < range ~ index_merge < ref < eq_ref < const < system。
rows : SQL 要查找到结果集需要扫描读取的数据行数,原则上 rows 越少越好。
可以通过查询 MySQL 的慢查询日志来要找到最需要优化的 SQL 语句。
# 开启慢查询日志功能
SET GLOBAL slow_query_log = 'ON';
# 慢查询日志存放位置
SET GLOBAL slow_query_log_file = '/var/lib/mysql/ranking-list-slow.log';
# 无论是否超时,未被索引的记录也会记录下来。
SET GLOBAL log_queries_not_using_indexes = 'ON';
# 慢查询阈值(秒),SQL 执行超过这个阈值将被记录在日志中。
SET SESSION long_query_time = 1;
# 慢查询仅记录扫描行数大于此参数的 SQL
SET SESSION min_examined_row_limit = 100;
备注: 设置好通过以下命令验证以下:
show variables like 'slow%'
cat /var/lib/mysql/ranking-list-slow.log
备注: 要确保自己有对应目录的访问权限:
chmod 755 /var/lib/mysql/
Time :被日志记录的代码在服务器上的运行时间。
User@Host :谁执行的这段代码。
Query_time :这段代码运行时长。
Lock_time :执行这段代码时,锁定了多久。
Rows_sent :慢查询返回的记录。
Rows_examined :慢查询扫描过的行数。
数据库更适合处理批量操作,合并多个相同的操作到一起,可以提高处理效率。
大批量操作可能会造成严重的主从延迟
binlog 日志为 row 格式时会产生大量的日志
避免产生大事务操作
索引字段的数据应该尽量不为 NULL,因为对于数据为 NULL 的字
段,数据库较难优化。如果字段频繁被查询,但又避免不了为 NULL,建议使用
0,1,true,false 这样语义较为清晰的短值或短字符作为替代。
我们创建索引的字段应该是查询操作非常频繁的字段。
索引已经排序,这样查询可以利用索引的排序,加快排序查询时
间。
经常用于连接的字段可能是一些外键列,对于外键列并不
一定要建立外键,只是说该列涉及到表与表的关系。对于频繁被连接查询的字段,可以
考虑建立索引,提高多表连接查询的效率。
索引可以增加查询效率,但同样也会降低插入和更新的效率,甚至有些情况下会降低查询效率。
删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 后可以通过查询 sys 库的 schema_unused_indexes 视图来查询哪些索引从未被使用
全文索引不适用于 OLTP 场景(联机事务处理OLTP — 增删改查事务;区别于联机分析处理OLAP — 数据仓库分析)
禁止给表中的每一列都建立单独的索引
InnoDB 是一种索引组织表:数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引,但是表的存储顺序只能有一种。
InnoDB 是按照主键索引的顺序来组织表的
建立索引的目的是:希望通过索引进行数据查找,减少随机 IO,增加查询性能 ,索引能过滤出越少的数据,则从磁盘中读入的数据也就越少。
正确使用索引可以大大加快数据的检索速度(大大减少检索的数据量)
备注: MySQL隐式转换造成索引失效
覆盖索引:就是包含了所有查询字段 (where,select,order by,group by 包含的字段) 的索引
覆盖索引的好处:
前缀索引仅限于字符串类型,较普通索引会占用更小的空间,所以可以考虑使用前缀索引替代普通索引
关于索引见我另一篇文章:
数据库及缓存之MySQL索引
上一篇跳转—MySQL(一)常见知识点 下一篇跳转—MySQL(三)之高性能优化实战
持续更新中…
随心所往,看见未来。Follow your heart,see light!
欢迎点赞、关注、留言,一起学习、交流!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。