跪求MYSQL索引的正确使用

jim8590251 2009-04-19 03:53:54
最近做了个CMS网站,开始的时候速度还可以,但最近把2万数据导进去后就发现速度慢的出奇(未加索引)
后来加了索引发现速度确实改善了许多,但问题是,我前台和后台的索引好象有冲突
后台执行的SQL语句:
select a.ar_title,a.temp_url,a.ar_pic,b.typename from article a inner join artype b on(a.typeid=b.id) where a.ar_title like '%%'
针对这个语句加了alter table article add index adminindex(ar_title,typeid)
加上后速度变的非常快,我很满意
前台对应的SQL语句
select a.ar_title,a.temp_url,b.typename from artitle a inner join artype b on(a.typeid=b.id) where a.typeid=3 and a.ar_state=1 and a.isdel=0
针对这个语句alter tabel article add index index1(typeid)
速度也快了不少,但还是有点慢

问题是,我加了下面的一个索引后,上面的索引好象就不行了,执行速度就慢了,下来
如果只加一个索引2个都可以改善速度,但不能同时用,想知道SQL语句能不能指定用哪个索引,或者这个问题该如何解决
才2万数据而已,高级赐教
...全文
959 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
jim8590251 2009-04-21
  • 打赏
  • 举报
回复
把表的类型改成了MYISAM,问题解决了,速度得到了值的飞跃
感谢大家,我还以为MYSQL必须要索引才能得到速度,现在索引删除了,速度照样快,揭贴给分
TR@SOE 2009-04-20
  • 打赏
  • 举报
回复
索引是用来加速搜索的。每个数据库处理索引的方式应该还是有相同点的。

我对MySQL还是刚入手,也没有认真仔细的去看文档,但是我对InterBase很熟悉,所以借用那里的经验谈谈。

一、设立多少个索引?

假定一个表有几十个字段,是不是每个字段都要索引?还要再加上可能的复合索引?答案当然是否定的。索引的增加,会加快select的速度,但是会降低update、insert、delete的速度。索引越多,这个额外开销越大。

一般,我会创建一个主键索引和一个复合字段的唯一索引,然后再额外创建2-3个索引。这里没有任何法则,只能根据你的实际情况来定。

二、复合索引的技巧

假定一个藏书表中有这么几个字段:

书号,书名,作者,国别,出版社,版次,页数,价格,购买日期

一般搜索的时候,书名(先)+作者(后)是最常见的搜索方式,也可能直接搜索一个作者的书,当然,还可能单独搜索出版社以及购买日期区间内买的书。

于是我会这样来创建索引:

书号是我的内部编号,我就将其作为主键索引;但是这个PK根本不能防止我将一本书输入了两次,所以我创建一个复合唯一索引:书名+作者+购买日期。因为一般来说,我不会在同一时间买同一个作者的书超过一本(如果超过一本,多出来的也是送人,不会作为我的藏书)。如果你做藏书程序,可能字段更多,那么确定一本书的唯一性也不一定和我的相同。

有了这个复合唯一索引,我不需要再创建一个书名+作者的索引,因为任何where 书名 like '红%' and 作者 like '曹%'的搜索都将会自动使用该复合索引。单独搜索书名的检索也会优先考虑使用该复合索引。

请注意,这里的where条件中的条件出现次序是和创建索引时字段的次序是严格一致的。

至于针对作者、出版社、购买日期的检索,可以再单独创建三个单字段的索引。

三、关于like

很多人喜欢用like作为条件。如果非要用like,以求达到类似“全文”搜索的效果,那么千万不要用'%sss%'的条件。任何'%sss%'的条件,或者严格说%在开头的条件都是无法使用索引的。其后果必然是全文检索,效率会十分低下。

全文搜索我建议用Lucene或者Sphinx。

============

篇幅有限,就讲这么多了。



程序猿之殇 2009-04-20
  • 打赏
  • 举报
回复
加索引本身就是优化mysql的一种方式.

不一定所有的涉及查询的地方都加索引.

改善速度有很多办法,有数据库层面上的,有程序层面上的.等等.
jim8590251 2009-04-20
  • 打赏
  • 举报
回复
自从导入了2万的文章数据进去,凡是遇到读取文章表的地方,都变慢了,
加个索引,就改善了一个地方,可是变慢的地方太多了,难道还要加那么多索引吗
想不通MYSQL为什么非要加索引才能改善速度呢,有没有什么别的方法呢?
times3000 2009-04-20
  • 打赏
  • 举报
回复
学习,顶
程序猿之殇 2009-04-20
  • 打赏
  • 举报
回复
查看一下现有索引.
索引之间相互冲突,的确奇怪.
fxs_2008 2009-04-20
  • 打赏
  • 举报
回复

学习了

free999 2009-04-20
  • 打赏
  • 举报
回复
数据库2万就觉得慢?
那我觉得还是程序问题,是不是连接过多?或者写了很多子查询?
mysql大小也是数据库,2万数据就慢不可能的。
free999 2009-04-20
  • 打赏
  • 举报
回复
如果这样用 where a.ar_title like '%keyword%' 就不要给ar_title加索引了,没有效果。

mysql 的数据库搜索的确是很差的,这个没有人否认。。
不然很多php&mysql论坛也不至于限制搜索次数或者用其他方法搜索了。。。。

用like 语句,字段要做索引必须只有一个%,而且只能在后面
(记得不清楚了,不确定,反正不是前面就是后面,想确定的朋友可以自己测试下,或者google下,呵呵)
就是这样 like 'keyword%'

如果非要加索引,一个一个加应该会有效果。。
alter table article add index ar_title(ar_title);
alter table article add index typeid(typeid);
jim8590251 2009-04-20
  • 打赏
  • 举报
回复
我又导入了2万多的会员数据进去,发现会员列表速度一点也没变慢
我还没没有加索引呢,
为什么文章列表就如此的慢呢?
ricksyz 2009-04-20
  • 打赏
  • 举报
回复
这不是MySQL的问题
jim8590251 2009-04-20
  • 打赏
  • 举报
回复
我有点后悔用MYSQL了,要是MSSQL2万数据一点事也没有啊
jim8590251 2009-04-20
  • 打赏
  • 举报
回复
搜索不用like '%%'那怎么搜索啊?
lonelyriver 2009-04-19
  • 打赏
  • 举报
回复
不用跪求——
能帮的大家当然乐意帮了 是吧 呵呵
不要这么客气
Steve 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 jim8590251 的帖子:]
select a.ar_title,a.temp_url,b.typename from artitle a inner join artype b on(a.typeid=b.id) where a.typeid=3 and a.ar_state=1 and a.isdel=0
针对这个语句alter tabel article add index index1(typeid)

[/Quote]
索引看查询时候的参数,这条语句该加的索引参数是3个
alter table article add index adminindex2(typeid,ar_state,isdel)
索引之间不该影响速度.
cuidenghong123 2009-04-19
  • 打赏
  • 举报
回复
up
fxs_2008 2009-04-19
  • 打赏
  • 举报
回复
up!
wildlily980 2009-04-19
  • 打赏
  • 举报
回复
想知道SQL语句能不能指定用哪个索引,
==============================
可以.By specifying USE INDEX (index_list), you can tell MySQL to use only one of the named indexes to find rows in the table.

SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧