赞
踩
因为mysql是半双工的,如果查询的数据太大就会类似阻塞住通信,以此减小数据通信间数据包大小:
所以说需要避免使用select*并且加上LIMIT限制
1.类似于一层hashMap的缓存层
如果查询中包含自定义函数,存储函数,用户变量临时表小图标
则查询结果都不会缓存
2.不要轻易打开缓存,如果修改数据次数比较多,系统将需要费更多的精力用来删和读缓存,还会有碎片产生
1.多个小表替代大表
2.批量少次插入
3.合理控制缓存空间
4.可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存(将query_cache_type设置为DEMAND,这时只有加入SQL_CACHE的查询才会走缓存)
语法树—>查询计划
语法树是指语法分析阶段的将源代码转换为可执行代码
查询计划是指查询在数据库中实际执行时所采取的具体操作方式,但是查询计划一般有多个,性能对应也不同,就需要找到最优执行计划,
基于成本的优化器使得mysql会尝试每个查询计划并计算成本,(性能因素:数据量,硬件资源,执行算法之类的)
last_query_cost值就是查询的成本,单位: 次数据页的随机查找
(让我想起了英伟达还是哪家的一个算法,
计算性能过剩,但是处理过程长
就猜测处理的结果,然后在上一个函数结果导出前,把几个猜测的结果放到下一个函数运行,
如果上一个函数结果猜对的有就使用对应的下一个函数的预测结果)
定义表的关联顺序
优化MIN()和MAX()函数
提前终止查询
优化排序
只是建议,在实际生产或者测试的情况下需要仔细斟酌优化的可能性
遵循小而简单,就会节省磁盘,内存,CPU(是表,字段,都相对的变小)
整形比字符串代价低(但是uuid针对分布式大数据还是挺好用的)
mysql或者其他关系型数据库 一般是B-Tree索引(InnoDB是B+Tree,B+Tree是B-Tree的改进型,)
B意思是balance平衡,Tree就是二叉树
B+Tree是多路搜索树(二叉变成n叉)索引关键字都存放在叶子节点叶子节点用有序链表连接
特点是:
排序原则是字段内容(第一字段内容相同就看下一字段)
从索引上优化效率可以从以下几个方面:
通过冗余字段关联要比直接使用JOIN有更好的性能,或者通过创建关联相应列创建索引
SELECT film_id,description FROM film ORDER BY title LIMIT 50,5;
–>搜索页面尽量变少
SELECT film.film_id,film.description
FROM film INNER JOIN (
SELECT film_id FROM film ORDER BY title LIMIT 50,5
) AS tmp USING(film_id);
USING(film_id)
: 这是内连接的条件,使用INNER JOIN将电影表(film)与子查询的结果集(tmp)通过共同的列film_id进行连接。
SELECT id FROM t LIMIT 10000, 10;
改为:
SELECT id FROM t WHERE id > 10000 LIMIT 10;
第二句直接过滤出id>10000的然后才搜索前10条,效率更高
优化UNION
一般是创建临时表,然后查询之后再插入,再做查询
所以最好将LIMIT where等修饰词,放入各个子查询
如果需要服务器去重,则需要用UNION ALL
早期mysql4.1之前(有说版本5)
varchar的宽度是以字节为单位
varchar(255)就是85个汉字 (假如是UTF-8 一个字符三字节)
对于现在mysql4.1之后(有说版本5)
varchar的宽度是以字符为单位
varchar(255)就是255个汉字
新版本中varchar可以不带数字,意思就是可以自动扩展(知道固定字符串大小的话还是写char,比较省空间,text之类的类型没最大长度限制)
varchar最长为65535字节 64KB (和MyISAM数据引擎一行最大值一样,意味着机端情况 下一整行都是varchar字段)(InnoDB行最大限制是16KB)
参考
最全 MySQL 优化方法,从此优化不再难:https://zhuanlan.zhihu.com/p/59818056
《高性能mysql》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。