楼主: cyt2005

帮忙mysql 语句调优

[复制链接]
论坛徽章:
14
会员2007贡献徽章
日期:2007-09-26 18:42:10生肖徽章2007版:鸡
日期:2009-10-29 16:15:30生肖徽章2007版:兔
日期:2009-04-14 19:32:34生肖徽章2007版:猴
日期:2008-11-28 10:39:32奥运会纪念徽章:摔跤
日期:2008-08-12 10:59:32奥运会纪念徽章:艺术体操
日期:2008-08-07 09:43:42奥运会纪念徽章:举重
日期:2008-05-04 17:12:35生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53
21#
 楼主| 发表于 2008-1-21 10:26 | 只看该作者
WESTLIFE_XU
改成inner join和用=,从explain来看结果是一样的

使用道具 举报

回复
论坛徽章:
41
ITPUB元老
日期:2007-04-18 10:10:372012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23迷宫蛋
日期:2012-05-09 13:09:18双黄蛋
日期:2013-01-21 12:55:59马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
22#
发表于 2008-1-21 10:36 | 只看该作者
原帖由 cyt2005 于 2008-1-21 10:26 发表
WESTLIFE_XU
改成inner join和用=,从explain来看结果是一样的



我明白的说了,把inner join改为等号 可读性上会好很多,没有说会有性能上的提高。

性能提高在于where后面的条件。




你自己可以简单的判断一下:
select  work_status_id,count(*) from i1 group by work_status_id。 看看work_status_id=2在整个表中占了多少的数据。同理也可以count(*)其他表的数据。 假设每个表都返回1000条,就算五个表吧。这个sql需要运行1000^5次数,那肯定不会很快了。这时候你要从应用层面上去考虑了

[ 本帖最后由 WESTLIFE_XU 于 2008-1-21 10:41 编辑 ]

使用道具 举报

回复
论坛徽章:
40
生肖徽章2007版:马
日期:2008-04-07 19:43:48管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
23#
发表于 2008-1-21 10:37 | 只看该作者
原帖由 cyt2005 于 2008-1-21 10:25 发表
哈哈
感觉jinguanding兄那个酒醉的晚上有些消沉啊
我的key_buffer是256m
我想应该够用吧


改大一点吧 。我现在就用768M。不过我们的单机可能用不了多久了。

对了。酒醉的那个晚上在哪里啊?

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
24#
发表于 2008-1-21 12:59 | 只看该作者
跟几个志同道合的朋友与同学..........谢谢两位的关心.......郁闷就是没生产的模拟设备啊......我这笔记本太差了..07.6买的还花了5900大洋


杨兄...我跟你一起学习群集噢.....以及负载均衡.........

使用道具 举报

回复
论坛徽章:
40
生肖徽章2007版:马
日期:2008-04-07 19:43:48管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:092012新春纪念徽章
日期:2012-02-13 15:08:09马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14
25#
发表于 2008-1-21 13:32 | 只看该作者
原帖由 jinguanding 于 2008-1-21 12:59 发表
跟几个志同道合的朋友与同学..........谢谢两位的关心.......郁闷就是没生产的模拟设备啊......我这笔记本太差了..07.6买的还花了5900大洋


杨兄...我跟你一起学习群集噢.....以及负载均衡.........



我也是刚开始研究。大家一起进步吧

使用道具 举报

回复
论坛徽章:
14
会员2007贡献徽章
日期:2007-09-26 18:42:10生肖徽章2007版:鸡
日期:2009-10-29 16:15:30生肖徽章2007版:兔
日期:2009-04-14 19:32:34生肖徽章2007版:猴
日期:2008-11-28 10:39:32奥运会纪念徽章:摔跤
日期:2008-08-12 10:59:32奥运会纪念徽章:艺术体操
日期:2008-08-07 09:43:42奥运会纪念徽章:举重
日期:2008-05-04 17:12:35生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53
26#
 楼主| 发表于 2008-1-21 16:25 | 只看该作者
原帖由 WESTLIFE_XU 于 2008-1-21 10:36 发表



我明白的说了,把inner join改为等号 可读性上会好很多,没有说会有性能上的提高。

性能提高在于where后面的条件。




你自己可以简单的判断一下:
select  work_status_id,count(*) from i1 group by work_status_id。 看看work_status_id=2在整个表中占了多少的数据。同理也可以count(*)其他表的数据。 假设每个表都返回1000条,就算五个表吧。这个sql需要运行1000^5次数,那肯定不会很快了。这时候你要从应用层面上去考虑了


恩,明白
但是我有个问题,我这有的表就是有一些flag的列,里面的值呢无非就是1,2,3,4之类的,每个都有特别的含义
查询的时候呢又经常会用到,那我如何建立索引呢?
首先数据的选择性并不很好,而且即使就这么几个值,数据也不是均匀分布,比如很可能50%的数据集中在col=1,1%的数据集中在col=4,其次如果在oracle下建立bitmap索引的话,有可能引起死锁问题(这个问题我在工作中遇到过),再者mysql根本也不支持bitmap索引啊,各位有啥好办法么?

使用道具 举报

回复
论坛徽章:
41
ITPUB元老
日期:2007-04-18 10:10:372012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23迷宫蛋
日期:2012-05-09 13:09:18双黄蛋
日期:2013-01-21 12:55:59马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
27#
发表于 2008-1-21 17:49 | 只看该作者
bitmap索引要慎用,通常适合在表更新很少很少的情况下。

至于怎么建索引,要看你的业务需求,如果你的where col=4且只有1%的数据集中在col=4,在这个列建索引就很合适了。如果col=不确认会等于什么(1,2,3,4),那就不好办了。

如果你的数据量就这么大,表关联又好几个,那本身就很难优化,这需要从应用上在考虑考虑。

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
28#
发表于 2008-1-21 17:53 | 只看该作者
你可以考虑使用范围索引嘛..就是flag字段跟另外一个字段能决定较少或者唯一的记录...并且该字段也是经常作为Where 中的查询条件与flag一同出现..


select  ....

from

where (flag=1 and colname =...) .....

(flag=1 and colname =...) 这样优化器分析的时候就快点....

使用道具 举报

回复
论坛徽章:
41
ITPUB元老
日期:2007-04-18 10:10:372012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23迷宫蛋
日期:2012-05-09 13:09:18双黄蛋
日期:2013-01-21 12:55:59马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
29#
发表于 2008-1-21 17:54 | 只看该作者
恩,联合索引我也用的比较多

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
30#
发表于 2008-1-21 18:05 | 只看该作者
bitmap索引 在mysql中好象不支持..myisam引擎只支持B-tree存储

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表