免费注册 查看新帖 |

Chinaunix

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

讨论如何优化性能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-15 10:39 |只看该作者 |倒序浏览
mysql 3.23

目前有一个company表,内有company_id字段 int,autoincreamt,company_name字段,varchar(100),放的都是公司名称,还有一些企业相关信息。

有一个搜索需要对company_name进行模糊查找

目前数据在1500万条左右,搜索速度已经极慢,客户端是用php实现

未来数据估计在5000万条左右

想问一下大家有没有比较好的优化IDEA,让这个搜索时间上稍微可以接受一点。

还有两个疑惑的地方,给出两个语句mysql 语句如下

  1. "select * from company where company_name like '%".$keyword."%' limit 0,10"
复制代码

  1. "select * from company where company_name like '%".$keyword."%' limit 1000,10"
复制代码


只是一个limit的开始记录不同,但是这两句话通过PHP在浏览器中执行,其性能差异太惊人了。。前后要相差10秒左右

也许我理解不对,根据explain 出来来看,两句语句同时都历遍了整个表,也就是说,limit参数只是对输出作出了限制,并不对搜索有任何影响。

但从两句语句的表现来看,我个人认为,mysql的输出是不是如果limit 0,10 就是10条进入了内存,然后输出
而limit 1000,10 就必须要1000条先进入内存,然后在输出其后的10条,不知道有没有比较理解MYSQL机制的同学帮我解释以下


问题二

索引问题,对于COMPANY_NAME这样的字段,即一般存放中文的字段,索引是不是没有必要的?

尤其是中文一般用来模糊查找的时候,目前我的表是加了索引,但感觉去掉索引之后搜索速度是差不多的

想知道对于中文的搜索是如何进行的,先转成什么形式进行比较呢? 如果用字母是不是转成ASC2,那中文呢

转成什么?


谢谢,以上问题判断有知道的同学指点指点我,刚学MYSQL,懂的太少

论坛徽章:
0
2 [报告]
发表于 2006-03-15 14:10 |只看该作者
顶一下,是不是我问的太幼稚了,大家帮忙看看

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2006-03-15 14:17 |只看该作者
company_name 是不是主键 ? 中文搜索也需要索引的。 like操作本来就耗时


limit 1000,10  和limit 0,10当然差异很大 。都历遍整个表,但前者只要排序出前1010个,后者只需要排序前10个、

论坛徽章:
0
4 [报告]
发表于 2006-03-15 15:26 |只看该作者
主键是 COMPANY_ID,把COMPANY_NAME做为主键对于搜索有帮助吗?
由于以前建表的时候没有主意,目前在表内有COMPANY_NAME已经有不少的重复值,所以设为主键还是比较麻烦的。

但设为主键真的有帮助吗?

还有能不能有这种方法,因为COMPAN_ID是递增的并且是主键,能否让MYSQL在每次搜索出20条数据后就停止继续搜索,并记录当前ID,然后翻页的时候继续从记录ID开始搜寻,这样性能感觉上要提高很多,不必每次都历遍这个表啊,但LIMIT是无法达到这种预期的,有没有更好的查询方式。。。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2006-03-15 15:40 |只看该作者
问是不是主键的意思就是确认是不是UNIQUE 。

排序就必须得历遍整个表,没更好的排序方法。只有改变排序的逻辑

论坛徽章:
0
6 [报告]
发表于 2006-03-15 15:48 |只看该作者
只是一个limit的开始记录不同,但是这两句话通过PHP在浏览器中执行,其性能差异太惊人了。。前后要相差10秒左右

也许我理解不对,根据explain 出来来看,两句语句同时都历遍了整个表,也就是说,limit参数只是对输出作出了限制,并不对搜索有任何影响。

但从两句语句的表现来看,我个人认为,mysql的输出是不是如果limit 0,10 就是10条进入了内存,然后输出
而limit 1000,10 就必须要1000条先进入内存,然后在输出其后的10条,不知道有没有比较理解MYSQL机制的同学帮我解释以下
-------------------------------------------------------
LZ,有一个地方你理解错误了,limit 是针对 select ... where ...(如果有 where 的话) 已经筛选出来的结果再进行筛选。而不是你说先 limit 选出记录,然后在这有限的几条记录中再匹配 where 的条件。
而且,你使用了 like '%...%' 这样的匹配方式,那么,自然要遍历到每一条记录才能选出符合你条件的记录,然后再进行 limit 挑选。
我记得,使用 like 的话,除非是 like 'aaa%' 这样的方式,否则是无法使用 索引 的。我记得看索引的时候看到过这个,就是用该字段的前若干个字符建立索引。所以,它肯定是所有记录遍历。

论坛徽章:
0
7 [报告]
发表于 2006-03-16 09:04 |只看该作者
to LZ:
1. 用regexp代替like
2. 分表
3. 如果company_name不需要 100 位那么长,可以缩短一点,然后做索引
一个表1500w条记录,对一个varchar类型的字段作like搜索,基本上所有的情况都是比较慢的

论坛徽章:
0
8 [报告]
发表于 2006-03-16 16:15 |只看该作者
原帖由 yejr 于 2006-3-16 09:04 发表
to LZ:
1. 用regexp代替like
2. 分表
3. 如果company_name不需要 100 位那么长,可以缩短一点,然后做索引
一个表1500w条记录,对一个varchar类型的字段作like搜索,基本上所有的情况都是比较慢的


谢谢楼上的建议,分表已经做好,根据省市进行分成了32表,但感觉性能没有提高,似乎遍历32个表,比一个表还要慢

正则不太会用,能跟我解释一下大概的意思吗,把搜索字符串转换成正则表达式?


索引已经有了。。。用不用感觉不到


大家有没有什么好的方法,这种名称上的LIKE应该经常会遇见吧,产品啊,公司啊,都会用到的。

论坛徽章:
0
9 [报告]
发表于 2006-03-17 12:24 |只看该作者
也关注中........

论坛徽章:
0
10 [报告]
发表于 2006-03-17 13:02 |只看该作者
如果一定要对公司名称字段做模糊查询,可以试着去维护一个关键字表。用关键字去一对多连接你的公司信息表。
比如,XX贸易公司,取XX和贸易两个关键字,那么当你用 XX 或者 贸易 来查询数据库时,先找那个关键字表。
因为关键字字段短,加上用索引、并做全匹配搜索(就是不用 like 来处理),应该非常快。
如果这样找不到结果,那么再自动对 公司名称表 进行模糊查找。

不用该方法,也可以增加一个 企业简称 字段,然后是搜索这个简称字段,这么做也是很普遍的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP