0

在基于Web 的 Java 应用程序中,我有一个具有此模式的表

 Column          Datatype

 Userid          char(25) primary key;
 name            char(100)
 address         varchar(120)
 email           char(50) UNIQUE;

120000条记录。(基数)

现在,我想获取存储在列 -> 名称下的匹配名称(逐个字符)。当我开始在搜索框中输入内容时(显然是通过 ajax)。

例如,如果我写 p,那么所有从字母 p 开始的名字都会被检索出来,并会出现在列表中以进行填充。

现在我没有使用任何索引。那么如何使用它来加快访问/搜索速度

我使用的数据库是MySql 5java 作为前端

任何为此目的使用适当集合的建议或任何散列将有助于数据库,如果是,请详细说明。

虽然我已经为这个 StackOverflowers 找到了正确的轨道。如果我修改问题并使用散列代替索引及其所有定义和使用统计信息,那么如何做到这一点,它是否有益?

4

6 回答 6

1

最简单的方法就是:

ALTER TABLE `your_table` ADD INDEX(`name`);

而且,由于名称是可变长度的,请改用 VARCHAR。对于您的密钥,请使用 INT!

如果仅按一个字符搜索,则可以将索引缩小到一个字节:

ALTER TABLE `your_table` ADD INDEX `name`(`name`(1));

然后,为了获得更好的性能,您可以使用覆盖索引。这意味着您需要正确索引所有必需的数据,以便它驻留在内存中(确保您正确配置了服务器)并且 MySQL 不需要从磁盘读取。

于 2012-07-06T06:57:06.160 回答
1

默认情况下,PRIMARY KEY属性UNIQUE在表中被索引。所以,你的emailuserid已经被索引了。(注意:我严重建议您不要CHAR使用userid

并使用

INDEX `<any-name-here>` (`name`) # The `name` is the column and `<any-
                                 # name-here>` is the name of index.
于 2012-07-06T06:57:28.880 回答
1
CREATE INDEX id_index ON employee_table (employeeID);
于 2012-07-06T07:01:56.040 回答
0

在 WHERE 子句中的列上创建索引。

如果您的查询最有可能在名称上,请在名称列上创建索引。

请记住,这将利用您对该表的插入/更新记录,这意味着您的插入/更新操作将执行得更慢。

于 2012-07-06T06:58:52.057 回答
0

我不会使用数据库查询。您可以在 String 数组中预加载(唯一)名称,并对到目前为止键入的字符执行二进制搜索。这确保了最大的响应性。

于 2012-07-06T06:59:44.357 回答
0

一般来说,您必须了解数据库索引的工作原理。

但是对于您的问题,一些建议:

如果您使用的是这样的东西(对不起,我不知道 MySql 通配符,假设它是 %)

select * from MyTable where name like '%a%'

其中 a 是用户输入的字母 - 这永远不会在更大的表格上工作,因为第一个 % 表示 a 之前有任何字符 - 这意味着必须扫描整个表格(这意味着索引几乎没用)。

考虑实现自动完成器,使其在至少 3 个字符后开始自动完成,这将导致类似于以下的 SQL:

select * from MyTable where name like 'abc%'

这将允许数据库使用索引,因为它只使用以“abc”开头的数据

不幸的是,您在可用于查询的列上根本没有索引,因此您可以通过以下命令添加它:

ALTER TABLE 'table' ADD INDEX('column_you_search')

希望这可以帮助。

于 2012-07-06T07:03:12.617 回答