mysql索引及临时表的问题.请大侠们帮忙.

anziqi 2002-08-23 12:02:00
加精
我现在有一个很大的数据库,每次select都非常的慢.

有什么方法可以提速的.我听说用索引和临时表可以.

有谁能给我一个实例.感激不尽

高分相送.
...全文
639 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Shakespeare 2002-08-24
  • 打赏
  • 举报
回复
临时表将在你连接MySQL期间存在。当你断开时,MySQL将自动删除表并释放所用的空间。当然你可以在仍然连接的时候删除表并释放空间。

DROP TABLE tmp_table

关于索引,当然是你经常基于查询的字段。如果是很多个字段,那么用复合查询:
复合索引(有时称组合索引)是急于多个列的单一索引。MySQL在处理一条查询时每个表只使用一个索引,这意味着如果你有多个经常出现在WHERE子句中的列,你可能要通过创建一个复合索引来加快这些查询。
考虑下列表结构片断:
 CREATE TABLE people (
last_name VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
favorite_color VARCHAR(10) NOT NULL,
.
.
.
);
如果你常常基于last_name和first_name查询表,你可以从last_name和first_name的复合索引中获益:
INDEX last_first (last_name, first_name)
由于MySQL构建复合索引的方式,它可以使用last_first索引来回答基于last_name本身或last_name与first_name两者的索引。这是因为如果列涉及复合索引的“最左前缀”的形式,MySQL将只使用一个复合索引。
所以如果一个复合索引有多个列合成:
INDEX big_index (a, b, c, d, e, f, g, h, i)
MySQL可以用它来回答基于a、或a和b、或a和b和c、或a和b和c和d的查询。但它不能使用big_index处理基于e、或c和f、或g和i的查询,因为这些序列没有一个是从索引的最左边开始的。
复合索引尝被用于加快某些复杂查询,但你需要理解起局限,而且你永远应该进行一些测试,而不是简单地假设这样一个索引将会有帮助。

浅妄薄见,望与斟酌
结贴的时候最好是提交FAQ
anziqi 2002-08-24
  • 打赏
  • 举报
回复
"select tp_model,tp_type,tp_userid,tp_maker,tp_enc,tp_unit,tp_price,tp_stock,tp_notes,tp_id from dt_product
where tp_userid=".$p_v['userid']

这个查询我应该给那个建立索引.
是不是tp_userid但我建立索引后跟建立前一样用时4.48秒.
是我建立的索引不对吗?
anziqi 2002-08-24
  • 打赏
  • 举报
回复
谢谢你的回答.
还有一个问题.
这个临时表是不是在一段时间就自动的删除了.这是一个.
另外这个临时表有什么作用是不是他跟共他的表一样.只不过是定时的被删除.
如果我想加快我的速度是不是.我必须把我的想要查看的数据都移动到临时表中.
然后在这里查询.
因为他是定时删除的我还得在每一个查看时建立他.这个速度难道不会更慢吗?
真是头痛.我想象中的临时表是这样的.在我读取我想要一个表中的一个子集时.他自动把这个子集变成了一个临时的表.我可以在下次查询时在这个表中查.因为我以前的那个表真的太大了.
头痛不是这样的吧.
我很笨希望大家多多指教.分好说.
_Shakespeare 2002-08-24
  • 打赏
  • 举报
回复
临时表的建立
CREATE TEMPORARY TABLE tmp_table (
name VARCHAR(10) NOT NULL,
value INTEGER NOT NULL
)


索引
当MySQL发现列上有一个索引,它将使用索引而不是执行一个全表扫描。这节省了CPU时间(不必读取所有可能的值)和磁盘I/O,而且它改善了并发性,因为MySQL只锁定表足够长的时间来获得所需的行(基于它在索引中找什么)。当你在表中有大量的数据,最终的改善可能非常明显。
CREATE TABLE albums (
id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(80)NOT NULL,

INDEX title_idx (title)
);
正如你所见的,语句只是简单地在定义后增加了一个INDEX行告诉MySQL在albums表中的title列上创建名为title_idx的索引。你可以给一个表增加多个索引,就像你可在表中有多个列一样。单个索引也可以有多个列合成。

要给现有的表加上一个索引而不是重建表,你可以用ALTER TABLE命令:

ALTER TABLE albums ADD INDEX title_idx (title)

浅妄薄见,望与斟酌
anziqi 2002-08-24
  • 打赏
  • 举报
回复
这些我都已经知道了.

我只想知道临时表如何用.

能不能告诉我呀.

还有索引.

我要例子.请高手.可怜可怜我吧.呜~!~!~!~!~!为什么不告诉我.
darzui 2002-08-24
  • 打赏
  • 举报
回复
学习,收藏,这个应该进精华区
nne998 2002-08-23
  • 打赏
  • 举报
回复
如果表很大,的确会影响性能的,所以考虑分开来放,比如按年月,

table_200208等。。。
dejoy 2002-08-23
  • 打赏
  • 举报
回复
如果是执行select XX1,XX2,XX3 from table1 where userid=xxxx这样的语句的话,速度应该不会是很慢啊
anziqi 2002-08-23
  • 打赏
  • 举报
回复
谢谢两位是不是在mysql的字段建立索引了以后,

以后的查询就可以受用你的索引了.

我这这里有一个30万条的表.我userid有了索引.但执行select时我比较了一下.速度没有加快.

我是用php做的后台已经完成但我对他的速度就是不满意.能我一个例子吗>
如用临时表.或告诉我为什么我的速度并没有加快.

我的表是一个产品表里面有一个userid是用户的id一个有一千多个用户.
已经建立索引.我查询的是一个用户的所有产品都包括什么.

先谢了前两位希望可以给个例.拜托.
dejoy 2002-08-23
  • 打赏
  • 举报
回复
有几条建议
1.对where条件中最经常使用的字段建立索引.
2.使用select时尽量选择最少需要的字段,尽量避免使用如select * from table这样的语句.
3.尽量使查询的条件精确
4.如果返回数据量太大,可以分批返回,在查询语句后加LIMIT offset,rows,如
limit 5-10,返回第5-10条记录.
shuixin13 2002-08-23
  • 打赏
  • 举报
回复
提高一个查询语句的执行效率,
不是能用几句话就能说清楚的,
这对你所写的SELECT语句,所有的INDEX等等都有要求

建议查看 MySQL 的随机文档,

第十章节从MySQL得到最大的性能


56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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