mysql语句优化

1.设计表格的时选择合适的字段类型
 
一般来说,数据库中的表越小,在它上面执行的查询就会越快,因此在创建表的时候,为了获取更好的性能,我们可以将表的字段宽度设得尽可能的小。
1.1.尽可能选择VARCHAR来代替CHAR,但是如果某字段长度已经固定(手机号,邮编等)我们可以使用CHAR(11)来固定字段的长度。同样的整型字段我们我们也应该选择合适长度的类型。
1.2.对于某些字段(省份,性别等)我们可以选择整型字段来代替文本类型,因为数值型的数据被处理的速度较快
 
2.使用连接(JOIN)来代替部分子查询
 
使用子查询可以一次性完成很多逻辑上很多步骤才能完成的SQL操作,同时可以避免事务和表锁死,但是有些情况下可以使用连接代替子查询,因为这样不需要在内存中创建临时表来完成这个查询
2.1 在使用连接时可将部分数据查询出来后再进行连接
 
3.使用联合(UNION)来代替手动创建临时表
 
它可以把需要使用临时表的两条或更多的select查询合并到一个查询中,在客户端结束回话的时间自动删除临时表,要注意所有的select语句中的字段数目要相同
3.1 尽量避免在查询条件中使用or来连接条件,这样会引擎放弃索引进行全表扫描
SELECT id FROM SC WHERE id = 10 OR id = 20
可以选择下面这种
SELECT id FROM SC WHERE id = 10 UNION
SELECT id FROM SC WHERE id = 20
  
4.使用索引
 
索引是提高数据库性能的常用方法
4.1 索引应该用于JOIN,WHERE判断和ORDERBY排序的字段上
4.2 不要对含有大量重复值的字段建立索引,当索引列出现大量重复值的时间,查询可能不回去利用索引
4.3 应该注意的是建立索引是需要消耗计算机资源的,不要随意建立索引,索引提升select查询效率,但相应的降低了insert和update的效率,因为索引可能会被重新建立
 
5.优化查询语句
 
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用
5.1 最好在相同类型字段间进行比较操作
5.2 不要在查询中让字段类型进行自动转换,这样会引擎放弃索引进行全表扫描
5.3 在建立索引的字段上尽量不要使用函数进行操作,这样会引擎放弃索引进行全表扫描
5.4 在搜索字符型子串时,我们有时会使用like关键字和通配符,但这样是以牺牲系统性能为代价使做法变简单,部分搜索可以尝试下面的方法
SELECT `id` FROM books WHERE `name` LIKE "MySQL%"
SELECT `id` FROM books WHERE `name` >= "MySQL" AND `name` < "MySQM"
5.5 使用exists代替in是一个好的选择
5.6 尽量不要使用!=和<>或者对字段进行null判断,这样会引擎放弃索引进行全表扫描
5.7 不要使用select *,用具体字段代替“*”
5.8  数据类型出现隐式转换的时候也不会使用索引,特别是当列类型是字符串,那么一定记得在where条件中把字符串常量值用引号引起来,否则即便这个列上有索引,MySQL也不会用到,因为MySQL默认把输入的常量值进行转换以后才进行检索
 
原文地址:https://www.cnblogs.com/donghaojun/p/10937494.html