索引一文带你你搞懂索引如何优化( 三 )
13、使用短索引(前缀索引)
- 对列进行索引 , 如果可能应该指定一个前缀长度 。 例如 , 如果有一个CHAR(255)的列 , 如果该列在前10个或20个字符内 , 可以做到既使得前缀索引的区分度接近全列索引 , 那么就不要对整个列进行索引 。 因为短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作 , 减少索引文件的维护开销 。 可以使用count(distinct leftIndex(列名, 索引长度))/count(*) 来计算前缀索引的区分度 。
- 但缺点是不能用于 ORDER BY 和 GROUP BY 操作 , 也不能用于覆盖索引 。
- 不过很多时候没必要对全字段建立索引 , 根据实际文本区分度决定索引长度即可 。
- MySQL 并不是跳过 offset 行 , 而是取 offset+N 行 , 然后返回放弃前 offset 行 , 返回 N 行 , 那当 offset 特别大的时候 , 效率就非常的低下 , 要么控制返回的总页数 , 要么对超过特定阈值的页数进行 SQL 改写 。
- 示例如下 , 先快速定位需要获取的id段 , 然后再关联:
selecta.* from 表1a,(selectid from 表1 where条件 limit100000,20) b wherea.id=b.id; 15、如果明确知道只有一条结果返回 , limit 1 能够提高效率
- 比如如下 SQL 语句:
select* from user wherelogin_name=? - 可以优化为:
select* from user wherelogin_name=? limit 1 - 自己明确知道只有一条结果 , 但数据库并不知道 , 明确告诉它 , 让它主动停止游标移动 。
- 需要 join 的字段 , 数据类型必须一致 , 多表关联查询时 , 保证被关联的字段需要有索引 。
- 例如:left join是由左边决定的 , 左边的数据一定都有 , 所以右边是我们的关键点 , 建立索引要建右边的 。 当然如果索引在左边 , 可以用right join 。
- consts:单表中最多只有一个匹配行(主键或者唯一索引) , 在优化阶段即可读取到数据 。
- ref:使用普通的索引(Normal Index) 。
- range:对索引进行范围检索 。
- 当 type=index 时 , 索引物理文件全扫 , 速度非常慢 。
- 不要以为唯一索引影响了 insert 速度 , 这个速度损耗可以忽略 , 但提高查找速度是明显的 。 另外 , 即使在应用层做了非常完善的校验控制 , 只要没有唯一索引 , 根据墨菲定律 , 必然有脏数据产生 。
- 索引越多越好 , 认为需要一个查询就建一个索引 。
- 宁缺勿滥 , 认为索引会消耗空间、严重拖慢更新和新增速度 。
- 抵制惟一索引 , 认为业务的惟一性一律需要在应用层通过“先查后插”方式解决 。
- 过早优化 , 在不了解系统的情况下就开始优化 。
- 既然索引可以加快查询速度 , 那么是不是只要是查询语句需要 , 就建上索引?答案是否定的 。 因为索引虽然加快了查询速度 , 但索引也是有代价的:索引文件本身要消耗存储空间 , 同时索引会加重插入、删除和修改记录时的负担 , 另外 , MySQL在运行时也要消耗资源维护索引 , 因此索引并不是越多越好 。 一般两种情况下不建议建索引 。
- 第一种情况是表记录比较少 , 例如一两千条甚至只有几百条记录的表 , 没必要建索引 , 让查询做全表扫描就好了 。 至于多少条记录才算多 , 这个个人有个人的看法 , 我个人的经验是以2000作为分界线 , 记录数不超过 2000可以考虑不建索引 , 超过2000条可以酌情考虑索引 。
推荐阅读
- 基尔摩斯|2020年中报最有料的瓜,一文看尽
- 央视网|带你逛服贸 | 文化服务专题展 规模大、颜值高、创意多
- 上海黄浦|用双脚丈量“黄浦最上海”的魅力 这场定向赛带你来体验!
- 带你逛服贸 | 文化服务专题展 规模大、颜值高、创意多
- 游龙战神|2020年中国搜索引擎行业市场现状及发展前景分析
- 阿文带你看足球|高颜值身材傲人,路人王一役走红网络,她是“篮球界江疏影”
- 阿文带你看足球|她是“篮球界江疏影”,高颜值身材傲人,路人王一役走红网络
- 粉笔教育带你走近90后扶贫基层,聆听“女承父志”的青春故事
- IT世界|导致MySQL索引失效的几种常见写法,请看这里
- 微微带你笑|看完笑出猪叫声,图1小哥已火遍全球,p图大神发起“狠”来
