磨石是快刀的朋友,草原是骏马的朋友,障碍是意志的朋友,困难是胜利的朋友。命运不是天能注定的,命运是依人奋斗的程度由人自己来决定的。
可以把SQL的查询结果缓存起来,存入视图中.
创建视图:缓存查询结果
CREATE VIEW students_view AS (SELECT * FROM students WHERE class = ‘95033‘)
使用视图
SELECT * FROM students_view WHERE sex = "男";
查询SQL尽量不要使用select *,而是具体字段
避免在where子句中使用or来连接条件
使用varchar代替char
尽量使用数值替代字符串类型
主键(id):primary key优先使用数值类型int,tinyint
性别(sex):0-代表女,1-代表男;数据库没有布尔类型,mysql推荐使用tinyint
支付方式(payment):1-现金、2-微信、3-支付宝、4-信用卡、5-银行卡
服务状态(state):1-开启、2-暂停、3-停止
商品状态(state):1-上架、2-下架、3-删除
查询尽量避免返回大量数据
使用explain分析你SQL执行计划
是否使用了索引及其扫描类型
type:
ALL 全表扫描,没有优化,最慢的方式
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
key:
优化like语句
模糊查询,程序员最喜欢的就是使用like,但是like很可能让你的索引失效
#反例:%开头
SELECT NAME FROM student WHERE NAME LIKE ‘%某‘
SELECT NAME FROM student WHERE NAME LIKE ‘%某%‘
#正例
SELECT NAME FROM student WHERE NAME LIKE ‘某%‘
字符串怪现象
#反例:未使用索引
SELECT * FROM student WHERE NAME=123
#正例:
SELECT * FROM student WHERE NAME="123"
因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为数值类型再做比较
索引不宜太多,一般5个以内
索引不适合建在有大量重复数据的字段上
批量插入性能提升
提高group by语句的效率
删除冗余和重复的索引
不要有超过5个以上的表连接
inner join 、left join、right join,优先使用inner join
三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小
如果inner join是等值连接,返回的行数比较少,所以性能相对会好一点
同理,使用了左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。这是mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优
1, 尽量使用字段名代替*
2, 做表设计时,字段的类型最好是varchar代替char
3, 字段里的值,最好用数字代替字符串
4, 尽量把过滤条件精细,能用and不用or
5, 索引的设计,最多5个,不能太多
6, 模糊查询,尽量要确定开始元素,让索引生效
7, 数据库对数字没有严格的要求,name=123索引失效,name=‘123’索引生效
8, 无用的索引最好及时删除
原文:https://www.cnblogs.com/fangweicheng666/p/15169013.html