有选择地减少数据库索引的策略

时间:2010-12-22 14:56:43

标签: sql mysql rdbms

我有一个索引字段users.username,它仅用于管理界面。因为该表当前有很多写入,所以我想删除该索引。当然,我想保持索引可供管理员搜索。

我可以提取整个列,将该索引移动到另一个表。但它感觉很愚蠢,因为我已经计划将写入的重字段移动到另一个表中(只有一个索引)。

投入搜索引擎会有点矫枉过正。

有关简单解决方案的任何想法吗?

[编辑] 我刚刚意识到管理员需要搜索和排序很多字段会影响很多表(实际上需要更多的索引)。对于第一步,我将确保管理员获得专用服务器+数据库以阻止从实时服务器进行缓慢排序/搜索,并且从长远来看,我将调查搜索引擎是否合适。谢谢大家!

3 个答案:

答案 0 :(得分:2)

MySQL不支持维护某些用户只能访问的索引,即使它是,它也会像维护通常的索引一样昂贵。

假设用户名是唯一的,您可以创建一个类似于索引的表:

CREATE TABLE shadow_username (username VARCHAR(100) NOT NULL PRIMARY KEY, userid INT NOT NULL, UNIQUE (userid))

,及时填写:

TRUNCATE
        shadow_username

INSERT
INTO    shadow_username
SELECT  username, id
FROM    users

并查询它:

SELECT  u.*
FROM    (
        SELECT  id
        FROM    shadow_username
        WHERE   username = 'user'
        ) s
JOIN    users u
ON      u.id = s.id
UNION ALL
SELECT  u.*
FROM    users
WHERE   id >
        (
        SELECT  MAX(id)
        FROM    shadow_username
        )
        AND username = 'user'
UNION ALL
SELECT  *
FROM    users
WHERE   username = 'user'
LIMIT 1

第一部分进行正常搜索;第二部分处理在shadow_username的更新之间插入的用户名;第三部分是一种回退方法,只有在前两步没有发现任何事情时才进行正常搜索(如果用户更改了用户名,可能会发生这种情况)。

如果用户名永远不会改变,则应省略第三步。

答案 1 :(得分:1)

如果我理解正确,你就不能只有$ ways_to_access_data的某个子集(即管理界面与公共界面)的索引。

列是索引的,还是不是。

答案 2 :(得分:0)

我不确定实际问题在哪里。写入“用户名”字段,在这种情况下,保证更新索引(以及是否将索引编入索引是读取性能和写入性能之间的权衡),还是不写入(我是'假设,因为大多数用户倾向于改变他们的名字而不是很少),在这种情况下,你的RDBMS根本不应该触及索引。

看着我的水晶球,我认为“用户”表中的“写重”字段是登录会话,无论如何都应该存在于单独的表中。