MySQL优化案例-云栖社区-阿里云

MySQL优化案例 1.创建索引并传输正确的数据类型 原SQL语句(没有任何修饰):SELECT uid FROM user WHERE mo=13725525225 LIMIT 0,1; 在WHERE查询条件后mo字段添加索引-->给mo字段添加索引 查看数据库字段数据结构,发现mo字段定义的是char数据类型。

MySQL优化案例

1.创建索引并传输正确的数据类型

原SQL语句(没有任何修饰):SELECT uid FROM user WHERE mo=13725525225 LIMIT 0,1;
在WHERE查询条件后mo字段添加索引-->给mo字段添加索引
查看数据库字段数据结构,发现mo字段定义的是char数据类型。而传入的类型为int型,发生了隐式转换。

通过explain查看sql的执行计划

常见的隐式转换,包括字段数据类型以及字符集定义不当导致数据类型的隐式转换。

避免在索引函数中加入函数,会导致索引失败。

2.分页查询SQL优化案例

原SQL语句:开发中常见的开发sql语句
SELECT * FROM uyer
WHERE sellerId = 765922982
AND gmt_modified >= '1970-01-01 08:00:00'
AND gmt_modified <= '2013-06-05 17:11:31'
LIMIT 255000,5000;
MySQL在进行上述翻页写法,在越往后的过程中速度越慢。原因MySQL会读取表中的前M+N数据,M越大,性能越差。
优化后SQL语句:
SELECT t1.* FROM uyer t1,
(select id from uyer sellerid=100 limit 100000,5000) t2
WHERE t1.id=t2.id;
在t表中sellerid字段添加索引,id为表的主键。

2.子查询SQL优化案例

原SQL语句:
SELECT first_name
FROM employees
WHERE emp_no IN (SELECT emp_no FROM salariy_2000 WHERE salary = 5000);
MySQL处理逻辑:遍历employees的每一条记录,代入到子查询中去查询。
改写子查询:
SELECT first_name
FROM employees emp,(SELECT emp_no FROM salariy_2000 WHERE salary = 5000) sal
WHERE emp.emp_no = sal.emp_no;

分页优化:采用高效的limit写法,来避免分页查询给数据库带来的影响。

子查询:修改子查询保证数据库不会遍历扫描每一个记录

查询需要的字段:不要使用select * 查询所有字段,只查询自己需要的数据字段。