我使用php,我有一个包含2列varchar的表,一个用于用户识别,另一个用于页面名称输入。
它们都必须是varchar。
我想在用户输入页面时插入忽略数据以了解他是否访问过该页面,并且我想获取用户所在的所有行。
我希望以最有效的方式做到这一点。
在不检查其他查询的情况下插入的最佳方式是什么?
除了之外的最佳方式是什么:
SELECT * FROM table WHERE id = id
当需要的列是varchar时来获取
答案 0 :(得分:2)
您应该考虑这样的规范化表结构:
CREATE TABLE user (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE page (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE pages_visted (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED,
page_id INT UNSIGNED,
UNIQUE KEY (user_id, page_id)
);
INSERT IGNORE INTO pages_visted (user_id, page_id) VALUES (:userId, :pageId);
SELECT page_id FROM pages_visted WHERE user_id = :userId;
答案 1 :(得分:1)
我认为你想要实现一个复合主键。
复合主键告诉MySQL您希望主键是字段的组合。
此处有更多信息:Why use multiple columns as primary keys (composite primary key)
我不知道您的查询有更好的选择,但我可以建议,如果可能的话:
将列定义为NOT NULL。这样可以加快处理速度并减少存储空间。它有时也会简化查询,因为您不需要在特殊情况下检查NULL。
对于可变长度的行,由于记录的大小不同,您会在表中执行更多碎片操作,从而执行许多删除或更新。您需要定期运行OPTIMIZE TABLE以保持性能。