我有一个索引字段users.username,它仅用于管理界面。因为该表当前有很多写入,所以我想删除该索引。当然,我想保持索引可供管理员搜索。
我可以提取整个列,将该索引移动到另一个表。但它感觉很愚蠢,因为我已经计划将写入的重字段移动到另一个表中(只有一个索引)。
投入搜索引擎会有点矫枉过正。
有关简单解决方案的任何想法吗?
[编辑] 我刚刚意识到管理员需要搜索和排序很多字段会影响很多表(实际上需要更多的索引)。对于第一步,我将确保管理员获得专用服务器+数据库以阻止从实时服务器进行缓慢排序/搜索,并且从长远来看,我将调查搜索引擎是否合适。谢谢大家!
答案 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根本不应该触及索引。
看着我的水晶球,我认为“用户”表中的“写重”字段是登录会话,无论如何都应该存在于单独的表中。