mysql建立索引的方法

单表的索引

以下面的表为例,表叫article。
图片p31表结构

创建索引语句:create index idx_ccv on article(category_id,comments,views);
查询语句:explain select id,author_id from `article` where category_id=1 and comments>1 order by views desc limit 1;
explain的结果如下:
图片p31未优化索引

extra列出现了using filesort,全表扫描,说明索引跟没有上一样,并没有加快速度。原因是这样的,根据索引的创建顺序,我们先建立的是category_id,索引先按照有序的category_id查找,之后遇到了comments>1的range查询,在按照有序的comments查询的时候,无法再保证views是有序的,所以索引没发继续用,只能全表扫描。

两个表的索引

两个表结构class和book。
图片p32class
图片p32book

连接查询语句:select * from book left join class on book.card=class.card;
首先一个问题就是,这个索引在calss表还是book表?

直接给出结论: 左连接索引建在left join右面的表,右连接索引在right join左面的表
以左连接为例:
创建索引:create index idx on class(card);
左连接查询:explain select * from book left join class on book.card=class.card;
explain结果:
图片p32左连接explain

对于左连接,左表必须全部查询,所以做表建索引没有意义,给右表建就可以了,右连接同理。

两个以上表的索引

在两个表的基础上又建立了一个phone表。
图片p33phone表

查询语句:select * from class left join book on class.card=book.card left join phone on book.card=phone.card;

根据两个表的经验,可以推出应在leftjoin右边建索引,也就是book和phone上面对card列建立索引。

join的优化

  1. 用小的结果集驱动大的结果集。left join左边集合最好是小的。
  2. 优先优化内层循环。
  3. join的被驱动表要加上索引。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值