免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1796 | 回复: 3
打印 上一主题 下一主题

请教如何优化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-28 18:33 |只看该作者 |倒序浏览
有一个很简单的表。
desc service_info;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| sid        | varchar(20)  | YES  |     | NULL    |                |
| serviceid  | varchar(20)  | YES  |     | NULL    |                |
| post_time  | datetime     | YES  | MUL | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

其中sid列会存在数万种sid的值,每个sid的值有十几条数据。整个表约五十万条数据。

系统要大量的进行类似的查询
select * from service_info where sid='123321123321';
现在每次查询用时间将近1秒。

目前已经在sid列增加了索引。
但是估计是因为sid存在重复的情况,所以查询比较慢。
explain select * from service_info where sid='123321123321';
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | service_info | ALL  | sid           | NULL | NULL    | NULL | 492161 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+

即使强制使用索引解释出来还是不使用索引
explain select * from service_info use index(sid) where imei=123321123321;
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | service_info | ALL  | sid           | NULL | NULL    | NULL | 492161 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+--------+-------------+

大家给出出主意怎么能使查询快起来。

论坛徽章:
0
2 [报告]
发表于 2009-12-29 09:52 |只看该作者
如果你sid是全数字的话不应该用varchar,而应该用int或者适合你sid范围的某个data类型,因为字符串比较有额外的性能开销
而且你默认值为NULL,在索引上NULL的比较也会带来性能上的开销,如果不是业务需要请避免 NULL默认值,改用0或者其他带替

[ 本帖最后由 justlooks 于 2009-12-29 10:01 编辑 ]

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
3 [报告]
发表于 2009-12-29 11:10 |只看该作者
show indexes from service_info;
我想看一下你的sid的索引是怎么建的。

这么简单的语句不可能用不上 sid 索引,何况的你cardinality还这么高

论坛徽章:
0
4 [报告]
发表于 2009-12-30 00:49 |只看该作者
应该于信息统计不准了.
可以适当的时间运行一下:
ANALYZE TABLE  TbName;
然后在去explain 看看.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP