Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化MySQL触发器性能_Mysql_Sql_Triggers_Sql Update_Sql Insert - Fatal编程技术网

优化MySQL触发器性能

优化MySQL触发器性能,mysql,sql,triggers,sql-update,sql-insert,Mysql,Sql,Triggers,Sql Update,Sql Insert,我有以下表格结构。添加了两个触发器,但是由于触发器使用字符串值,并且它们搜索字符串,所以将来当每个表都变得巨大时,数据库性能可能会降低。我没有索引方面的丰富经验,也不知道索引哪些字段可以使触发器的搜索操作快速,即使有数百万行 你有什么建议 CREATE TABLE `ofRoster` ( `rosterID` bigint(20) NOT NULL, `username` varchar(64) NOT NULL, `jid` varchar(1024

我有以下表格结构。添加了两个触发器,但是由于触发器使用字符串值,并且它们搜索字符串,所以将来当每个表都变得巨大时,数据库性能可能会降低。我没有索引方面的丰富经验,也不知道索引哪些字段可以使触发器的搜索操作快速,即使有数百万行

你有什么建议

   CREATE TABLE `ofRoster` (
      `rosterID` bigint(20) NOT NULL,
      `username` varchar(64) NOT NULL,
      `jid` varchar(1024) NOT NULL,
      `sub` tinyint(4) NOT NULL,
      `ask` tinyint(4) NOT NULL,
      `recv` tinyint(4) NOT NULL,
      `nick` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`rosterID`),
      KEY `ofRoster_unameid_idx` (`username`),
      KEY `ofRoster_jid_idx` (`jid`(255))
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    CREATE TABLE `ofUser` (
      `username` varchar(64) NOT NULL,
      `plainPassword` varchar(32) DEFAULT NULL,
      `encryptedPassword` varchar(255) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL,
      `email` varchar(100) DEFAULT NULL,
      `creationDate` char(15) NOT NULL,
      `modificationDate` char(15) NOT NULL,
      PRIMARY KEY (`username`),
      KEY `ofUser_cDate_idx` (`creationDate`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    delimiter ;;
    CREATE TRIGGER `UpdateNickOnInsert` BEFORE INSERT ON `ofRoster` FOR EACH ROW BEGIN
    SET NEW.nick=(SELECT name FROM ofUser where username=NEW.username);
    END
     ;;
    delimiter ;

    delimiter ;;
    CREATE TRIGGER `UpdateRosterNicksOnUpdate` AFTER UPDATE ON `ofUser` FOR EACH ROW BEGIN
    IF NEW.name <> OLD.name 
    THEN  
      UPDATE ofRoster r SET r.nick=NEW.name WHERE r.username=OLD.username;
    END IF;
    END
     ;;
    delimiter ;

对于第二种情况,您最好使用级联外键约束;但是为什么要冗余地存储字符串数据呢?一个简单的用户id会更有效率。@uuerdo它是一个随时可用的软件数据库。Openfire服务器。这不是我的错。考虑到您当前的索引和触发器中的查询,我看不出有多少可以真正改进的地方;WHERE's中使用的字段已具有适当的索引。为什么要使用触发器更新这些字段?只要在需要信息时使用连接即可。不要存储重复的信息。@GordonLinoff软件数据库已准备就绪。Openfire服务器。数据库设计不是我的错。对于第二种情况,您最好使用级联外键约束;但是为什么要冗余地存储字符串数据呢?一个简单的用户id会更有效率。@uuerdo它是一个随时可用的软件数据库。Openfire服务器。这不是我的错。考虑到您当前的索引和触发器中的查询,我看不出有多少可以真正改进的地方;WHERE's中使用的字段已具有适当的索引。为什么要使用触发器更新这些字段?只要在需要信息时使用连接即可。不要存储重复的信息。@GordonLinoff软件数据库已准备就绪。Openfire服务器。数据库设计不是我的错。