给mysql数据表加索引的一次经验与体会.

 

昨天遇到一个问题:

在一张有三十万条纪录的数据表A,其主键自增字段id,name字段(varchar),还有type_id(int),在name字段上已经添加了索引。type_id由于是整型字段,认为加索引没有太多的意义,所以没有加索引。

本次有一个需求是在一个循环中按type_id查询此表A,结果一执行此循环,mySQL立刻占用CPU到200%以上,导致服务器响应极慢。

开始没想到是查询速度的问题,后来发现换一个表,CPU占用率立刻下降。于是分析了查询过询,发现每次查询都要遍历整表,所以数据库压力非常大。手工直接使用sql在数据库查询:

select * from A where type_id = xxxx

执行时间约为0.42s(400ms左右),速度较慢。

于是在type_id上添加索引,然后再执行同条语句。

执行时间为0.01s(10ms左右),速度明显提升(40倍左右)。

再执行循环,发现CPU占用8%左右,比较理想。

性能提升的原因分析:

type_id的值有特殊性:大部分type_id的值为0,索引效果明显。正好本次查询不需要查询type_id为0的纪录。如果要查询type_id为0的纪录,则效果提升可能不明显。

体会:

(1)在遇到查询性能的时候,适当的分析数据,添加索引,可能能大幅提高性能。

(2)是否添加索引,需要考量数据总量及数据更新频度再做决定。

(3)分析一条语句是否使用了索引。可使用 explain sql;

如explain select * from A where type_id = xxxx 会显示是否使用索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值