0

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

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

情况如下:

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

items_id (int 11)
项目(100 varchar)
cat_id (int 11)

在 PHPMyAdmin 它说索引:

键名/PRIMARY 类型/PRIMARY 基数/576 items_id

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

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

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

另一个(插入):

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

我的主要问题是:通过这些方法,我是否正在利用可能的最佳速度并利用已建立的索引?还是上面写着“慢”?

4

1 回答 1

1

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

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

好吧,实际上插入不会对索引做任何事情,除非您使用 InnoDB 作为存储引擎和外键约束。

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

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

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

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

如果您没有任何索引,甚至没有主键,那么任何Select语句都会进行全表搜索,这对于数十万个条目来说会变得非常缓慢。

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

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

主索引和唯一索引在一个值和一个记录之间具有直接对应关系。所以按唯一值搜索很快。

于 2012-06-27T23:38:28.583 回答