php MySql 2列作为索引,1作为另一个索引?

时间:2017-03-30 20:35:54

标签: php mysql mysqli

我使用php,我有一个包含2列varchar的表,一个用于用户识别,另一个用于页面名称输入。

它们都必须是varchar。

我想在用户输入页面时插入忽略数据以了解他是否访问过该页面,并且我想获取用户所在的所有行。

  1. 获取第一个varchar列的全部内容。
  2. 如果两个值都不存在则插入。
  3. 我希望以最有效的方式做到这一点。

    在不检查其他查询的情况下插入的最佳方式是什么?

    除了之外的最佳方式是什么:

    SELECT * FROM table WHERE id = id
    
    当需要的列是varchar时

    来获取

2 个答案:

答案 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以保持性能。