发现需要在MySQL中使用索引

时间:2012-06-27 23:35:20

标签: php mysql indexing

我在MySQL数据库中有三个或四个表与即将推出的Android应用程序相关联,这些表可能会非常快地爆炸到数千行。这时,我需要完成大约6 - 8个SELECT和2个INSERT SQL命令。

经过研究,我发现我将不得不使用索引来减少加载时间。我已经在不同的网站上搜索了几个教程,看看我是否可以选择这个 - 但是我没有发现什么能够非常清楚地解释什么以及如何做到这一点。

情况如下:

首先,它将使用Godaddy MySQL服务器。无限带宽和150,000 MB。这是一个将被大量使用的表:

items_id (int 11)
item (100 varchar) 
cat_id (int 11)

在PHPMyAdmin中,它表示索引:

Keyname/PRIMARY  type/PRIMARY        Cardinality/576    items_id

所以似乎建立了一个索引,对吗?

这是一个与此表(SELECT)相关的SQL查询(通过PHP):

 "SELECT * FROM items WHERE cat_id = ' ".$_REQUEST['category_id']."' ORDER BY TRIM(LEADING 'The ' FROM item) ASC;"

另一个(INSERT):

 "INSERT INTO items (item, cat_id) VALUES ('{$newItem}', '{$cat_id}')"

我的主要问题是:通过这些方法,我是否可以利用最佳速度并利用已建立的指标?或者这有什么“慢”写在它上面?

1 个答案:

答案 0 :(得分:1)

无法更改简单的选择 / 插入以利用索引。

但是可以将索引添加到表中以使查询运行得更快。

实际上插入不会对索引执行任何操作,除非您将InnoDB用作存储引擎和外键约束。

如果您在select语句的where / group by / order by子句中使用列,则可以考虑在其上添加索引。一个好的想法是对原因中的查询使用EXPLAIN,并查看数据库引擎如何使用where子句中的列。

如果一列有一小组非唯一可能的值(性别:男/女),为它添加一个索引是没有意义的,因为你不会搜索所有的女性或所有的男性(和半表搜索与全表搜索没有太大差别)。但是,如果您使用该列以及另一列来过滤/分组/排序,您可能希望在它们上添加复合索引(多列索引)。

MySQL中的数据库被组织为文件夹。这些文件夹包含每个表的多个文件。

有一个表定义文件,一个表数据文件和一些索引文件。如果为列或多列定义索引,则将创建该索引的文件。

如果您没有任何索引,甚至连主键都没有,那么任何选择语句都会进行全表搜索,这会使成千上万的条目变得非常慢。

如果您定义索引,它将读取表中该列或列集的所有唯一值,并写入一个文件,列出该列的某个值或那些列与包含它的记录之间的对应关系。< / p>

该文件应该比数据文件小得多,并且通常应该与其他索引文件一起完全适合内存。 MySQL现在必须与该文件中的匹配记录列表相交,以找出哪些记录符合选择标准,然后从数据表中挑选所需的数据。

主索引和唯一索引在一个值和一个记录之间具有直接对应关系。因此,通过独特的价值进行搜索很快。