在基于Web的java应用程序中,我有一个包含此架构的表
Column Datatype
Userid char(25) primary key;
name char(100)
address varchar(120)
email char(50) UNIQUE;
120000 条记录。 (基数)
现在,我想获取存储在列下的匹配名称(逐个字符) - >名字。当我开始在搜索框中输入时(显然是通过ajax)。
e.g。如果我写p,那么将从字母p开始的所有名称将被检索并将列在列表中以填充。
现在我没有使用任何索引 。那么我怎么能用它来访问/搜索更快。
我使用的数据库是 MySql 5 和 java作为前端。
任何关于为此目的使用适当的集合或任何散列的建议都会对数据库有所帮助,如果是,请详细说明。
虽然我已经为这个StackOverflowers找到了正确的轨道。如果我 修改问题并使用散列代替索引与其全部 定义和使用统计然后如何做到这一点,是它 有利?
答案 0 :(得分:1)
最简单的方法就是:
ALTER TABLE `your_table` ADD INDEX(`name`);
而且,由于名称是可变长度,因此请使用VARCHAR。对于您的密钥,请使用INT!
如果仅搜索一个字符,则可以将索引缩小为一个字节:
ALTER TABLE `your_table` ADD INDEX `name`(`name`(1));
然后,为了获得更好的性能,您可以使用覆盖索引。这意味着您需要正确索引所有必需的数据,以便它驻留在内存中(确保您正确配置了服务器)并且MySQL不需要从磁盘读取。
答案 1 :(得分:1)
默认情况下,PRIMARY KEY
和UNIQUE
属性会在表格中编入索引。因此,您的email
和userid
已经编入索引。 (注意:我认真建议您不要将CHAR
用于 userid )
并使用
INDEX `<any-name-here>` (`name`) # The `name` is the column and `<any-
# name-here>` is the name of index.
答案 2 :(得分:1)
CREATE INDEX id_index ON employee_table (employeeID);
答案 3 :(得分:0)
在WHERE子句中的列上创建索引。
如果您的查询很可能是名称,请在名称列上创建索引。
请记住,这将利用您对该表的插入/更新记录,这意味着您的INSERT / UPDATE操作将执行得更慢。
答案 4 :(得分:0)
我不会使用数据库查询。您可以在String数组中预加载(唯一)名称,并对目前为止键入的字符执行二进制搜索。这确保了最大的响应能力。
答案 5 :(得分:0)
在generell中,您必须了解数据库索引的工作原理。
但是对于你的问题,一些建议:
如果你正在使用这样的东西(抱歉,我不知道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')
希望这有帮助。