MYSQL语句优化总结

作者: 太阳上的雨天 分类: Mysql 发布时间: 2019-12-21 16:41

MYSQL语句优化总结

在实际项目中,数据量存储与读取是不可或缺的工作。读取数据不单单是把数据取出来就完事了,在数据量特别大的情况下,如何提高读取效率是一件很重要的事情.要想提高读取效率就要了解sql优化方案,小编在此对sql语句优化做了一个简单的总结,供大家学习交流。如有不对的地方,恳请各位看官指正

一在不使用索引的情况下sql语句优化

1.select语句中尽量避免使用*

是获取表中全部字段的意思,比如select from student,获取的是student表中全部字段的所有数据

优化思路:

比如我只需要这个表中姓名和成绩两个字段的数据,sql语句可以改成select name,achievement from student

补充:如果select * 用户连表查询,会占用更大的数据库服务器资源

2.select 语句中尽量避免使用in 和 not in

in和not in会导致数据库进行全表搜索,提高运行时间成本,可以使用between and代替

如:我想查询学号为1,和10的学生姓名和成绩

select name, achievement from student where stuno in(1,10);

优化:

Select name,achievement fron student where stuno between 1 and 10;

3.尽量避免使用or

使用or与使用in ,not in一样,会导致数据库进行全表检索。在实际项目工作中,如果想要从几十万上百万的数据中取出来你想要的数据,使用or是非常不划算的,可以使用union代替

如:从成绩表中取出来成绩为60和90的学生

select name,achievement from student where stuno=60 or stuno=90;

优化:

 select name,achievement from student where stuno=60 union select name,achievement from student where stuno=90

sql语句长,但是处理数据量较大的情况下,是可以省下时间成本的  

4.使用limit字句限制返回的数据行数

如果前端和APP开发人员只需要显示15行数据,而你的查询结果集返回了1万行,那么这适合最好使用limt子句来限制查询返回的数据行数。

5.Where 字句比较符号左侧避免使用函数或者表达式

尽量避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。因为这会导致数据库引擎进行全表扫描,从而增加运行时间。如果要使用表达式和函数,可以将其放置比较符号右侧

二.在建立索引的情况如何进行sql语句优化

1.避免在比较符号左侧使用表达式和函数

SELECT sname FROM stu WHERE age+10=30;– 不会使用索引,因为所有索引列参与了计算

SELECT sname FROM stu WHERE LEFT(date,4) <1990; — 不会使用索引,因为使用了函数运算,原理与上面相同

2.索引不会包含带有null值的列,尽量不要让字段为null
3. 不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
4. 尽量避免用or来作为连接条件,可使用union al
5.like语句操作,左模糊和全模糊将不走索引,右模糊走索引

      一般情况下不鼓励使用like操作,如果非使用不可,注意正确的使用方式。like ‘%aaa%’不会使用索引,而like ‘aaa%’可以使用索引。

6.隐式转换不走索引

当查询条件左右两侧类型不匹配的时候回发生隐式转换,隐式转换带来的影响就是可能导致索引失效进而全表扫描。下面的案列中,date_str是字符串,然后匹配的是整数类型,从而发生隐式转换

select  name,achievement  from  student where date_str = 201701

优化:

select  name,achievement  from  student where date_str = “201701“

7.多个单列索引并不是最佳选择

Mysql只能使用一个索引,会从多个索引中选择一个限制最为严格的索引,因此,为多个列创建单列索引,并不能提高mysql的查询性能

假设,有两个单列索引,分别为 news_year_idx(news_year) 和 news_month_idx(news_month)。现在,有一个场景需要针对资讯的年份和月份进行查询,那么,SQL 语句可以写成:

select * from news where news_year = 2017 and news_month = 1
事实上,MySQL 只能使用一个单列索引。为了提高性能,可以使用复合索引 news_year_month_idx(news_year, news_month) 保证 news_year 和 news_month 两个列都被索引覆盖。

8.复合索引的最左前缀原则

复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。

假设,有一个场景只需要针对资讯的月份进行查询,那么,SQL 语句可以写成:

select * from news where news_month = 1
此时,无法使用 news_year_month_idx(news_year, news_month) 索引,因为遵守“最左前缀”原则,在查询条件中没有使用复合索引的第一个字段,索引是不会被使用的。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注