Mysql索引和性能优化

使用索引的原则

  1. 如果没有唯一性要求,可以选择普通索引
  2. 如果列上有唯一性要求,可以选择唯一索引
  3. 如果是需要模糊搜索,建议选择全文索引
  4. 如果有多个条件一起查询,可以选择组合索引

使用索引需要注意以下几点:

  1. 按需使用索引
  2. 索引所在的列基数越大越好 , 男女这种字段建立索引的效果并不大 ,基数很小

3.在组合索引上要注意最左原则

我们想要知道我们的sql语句写的好不好,怎么来判断?

我们先说下sql语句是怎么执行的,举个例子

select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;

这条sql语句,会先执行哪一块? 执行的原理是什么?

select u.name i.expression from user u left join userinfo i on u.id=i.uid where u.id in (1,3,4,55,67,76) order by u.id limit 10;

sql语句执行的逻辑是这样的
第一步: 将user表和 userinfo表 做笛卡尔积
1.FROM 子句对其后面的左表user和右表执userinfo行笛卡尔积, 产生虚拟表VT1

2.ON 子句对VT1中的数据根据ON的条件进行过滤,产生虚拟表VT2
问题:怎么过滤的?

3.JOIN子句 将未符合条件的保留表中的数据添加都VT2中,形成VT3

4.WHERE子句 对VT3中的数据进行WHERE条件过滤,形成VT4

5.GROUP BY 子句对VT4中的数据进行分组操作,然后形成VT5

6.CUBE | ROLLUP 子句进行操作形成VT6

7.HAVING 对VT6中的数据进行HAVING 条件过滤,然后形成VT7

8.SELECT 从VT7中选择要获取的字段,然后形成VT8

9.DISTINCT 去重数据,形成VT9

10.ORDER BY 对VT9的结果排序后,形成VT10

11.LIMIT 从VT10中取出指定的数据,形成VT11,返回给用户

我们想要知道我们的sql语句写的好不好,怎么来判断?

方法一: 直接在数据库上测试,看看执行时间

方法二: explain select xxxx 查看

其中需要关注的几个参数:
type 的值有多个
const:表最多有一个匹配行,const用于比较primary key 或者unique索引。
eq_ref:它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY”。
eq_ref可以用于使用=比较带索引的列。
ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
range 给定范围内的检索,使用一个索引来检查行。
ref列显示使用哪个列或常数与key一起从表中选择行。
rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引。

    原文作者:葡萄酒不吐葡萄皮
    原文地址: https://segmentfault.com/a/1190000012323898
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞