MySQL索引

本文首发于kii.io

为什么要建立索引

多数情况下,不使用索引,试图通过其他途径来提高性能,纯粹是浪费时间(出自《MySQL技术内幕》)。

那索引是怎么提高性能的呢?

  • 通过索引能获取数据的结束位置,从而跳过其他部分
  • 定位算法,可以快速定位第一个匹配值

InnoDB总是使用B树来创建索引,对于这种索引,在使用<, <=,=,=>,!=,BETWEEN操作符时有会很有效率。

Tip: BETWEEN在Django ORM对应range操作符。

import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

相当于

SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

怎么建立索引

  • 总结业务场景,分析出最常用的会在where中出现的字段

比如以我们的项目而言,instance_nameuser_idcheck_date出现的频率最高,所以这三个字段肯定需要建立索引。通过这样的索引,可以避免全表查找。

  • 数据维度势

维度就是说表中容纳的非重复值的个数。我们尽量应该选择一些区分度高的,区分度=count(distinct col)/count(*),按照美团的博客来讲,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。

  • 不要滥用索引

由于在写入数据时,不仅要求写到数据行,还会影响所有的索引。所以索引建立越多,就会导致写入速度越慢。此外,索引会占据磁盘空间。

  • 为字符串的前缀编索引

索引可以减少索引空间,从而加快速度。

  • 复合索引

比如地址,Province, City,通过这两个值得组合来建立索引。

  • 最左前缀匹配

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

  • 不要把索引列加入计算

尽量不要在where中的“=”的左边,进行计算。

怎么查询

  1. 在where,order by语句中使用索引
  2. 避免在where中去使用数据维度势低的,比如sex,isDeleted等
  3. 如果是数字型字段,则使用数字类型
  4. 尽量不要使用!=, like或者>, <,引擎可能会进行全表搜索,考虑使用between,union等来替代。

使用Explain来优化SQL

先大概解释下Explain返回的字段名吧。

Column意义
select_typeselect类型
table展示行的table
typejoin类型
possible_keys索引的可能取值
key实际使用的索引
key_len使用索引的长度
ref跟索引
rows关键指标
filtered
Extra

具体可参考MySQL Explain

截止目前,我们进行的都是单表查询,接下来看看多表的。

先来复习下left join,right join, inner join, outer join:

SQL Joins

Ref:

  1. 美团点评团队
  2. MySQL技术内幕

专注数字货币、高并发、中间件。欢迎关注微信公众号。

技术公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值