Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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_Database_Optimization - Fatal编程技术网

MySQL查询优化-提高速度和效率

MySQL查询优化-提高速度和效率,mysql,database,optimization,Mysql,Database,Optimization,我想在数据库中获得一些电子邮件,每封电子邮件都有一个状态。所有可能的状态都存储在一个表中,在该表中它们都具有显示、编辑、删除等权限。。这些电子邮件不是通过网站拥有权限的用户,而是用户添加的电子邮件列表 以下是表格结构: 电子邮件表 状态表 下面是带有解释的慢速查询: SELECT EE.*, ES.name_fr AS statusName, ES.description_fr AS statusDescription, ES.permShow, ES.permSend, ES.permEdit

我想在数据库中获得一些电子邮件,每封电子邮件都有一个状态。所有可能的状态都存储在一个表中,在该表中它们都具有显示、编辑、删除等权限。。这些电子邮件不是通过网站拥有权限的用户,而是用户添加的电子邮件列表

以下是表格结构:

电子邮件表

状态表

下面是带有解释的慢速查询:

SELECT EE.*, ES.name_fr AS statusName, ES.description_fr AS statusDescription, ES.permShow, ES.permSend, ES.permEdit, ES.permDelete, ES.permImport , (SELECT GROUP_CONCAT(CONVERT(CONCAT(GC.name, '~', GC.group_id), CHAR(255)) SEPARATOR ',') FROM `group` GC INNER JOIN group_email GEC ON GEC.group_fk = GC.group_id WHERE GEC.email_fk = EE.email_id AND GC.deleted = 0) AS groups FROM `email__email` EE INNER JOIN email__status ES ON EE.status_fk = ES.status_id WHERE 1 = 1 AND EE.user_fk = 54 AND ES.permShow = 1 ORDER BY EE.email_id DESC LIMIT 15 EXTRA ID KEY KEY_LEN POSSIBLE_KEYS REF ROWS SELECT_TYPE TABLE TYPE Using temporary; Using filesort 1 user_email 4 user_email,user_fk,status_fk const 180681 PRIMARY EE ref Using where; Using join buffer 1 [empty string] [empty string] PRIMARY [empty string] 6 PRIMARY ES ALL Using index 2 email_fk 4 group_email,group_fk,email_fk mailing_dev.EE.email_id 1 DEPENDENT SUBQUERY GEC ref Using where 2 PRIMARY 4 PRIMARY mailing_dev.GEC.group_fk 1 DEPENDENT SUBQUERY GC eq_ref SELECT EE.* , (SELECT GROUP_CONCAT(CONVERT(CONCAT(GC.name, '~', GC.group_id), CHAR(255)) SEPARATOR ',') FROM `group` GC INNER JOIN group_email GEC ON GEC.group_fk = GC.group_id WHERE GEC.email_fk = EE.email_id AND GC.deleted = 0) AS groups FROM `email__email` EE WHERE 1 = 1 AND EE.user_fk = 54 AND EXISTS(SELECT permShow FROM email__status WHERE status_id = EE.status_fk AND permShow = 1) ORDER BY EE.email_id DESC LIMIT 15 EXTRA ID KEY KEY_LEN POSSIBLE_KEYS REF ROWS SELECT_TYPE TABLE TYPE Using where 1 PRIMARY 4 user_email,user_fk [empty string] 270 PRIMARY EE index Using where 3 PRIMARY 4 PRIMARY mailing_dev.EE.status_fk 1 DEPENDENT SUBQUERY email__status eq_ref Using index 2 email_fk 4 group_email,group_fk,email_fk mailing_dev.EE.email_id 1 DEPENDENT SUBQUERY GEC ref Using where 2 PRIMARY 4 PRIMARY mailing_dev.GEC.group_fk 1 DEPENDENT SUBQUERY GC eq_ref 下面是一个带有解释的快速查询:

SELECT EE.*, ES.name_fr AS statusName, ES.description_fr AS statusDescription, ES.permShow, ES.permSend, ES.permEdit, ES.permDelete, ES.permImport , (SELECT GROUP_CONCAT(CONVERT(CONCAT(GC.name, '~', GC.group_id), CHAR(255)) SEPARATOR ',') FROM `group` GC INNER JOIN group_email GEC ON GEC.group_fk = GC.group_id WHERE GEC.email_fk = EE.email_id AND GC.deleted = 0) AS groups FROM `email__email` EE INNER JOIN email__status ES ON EE.status_fk = ES.status_id WHERE 1 = 1 AND EE.user_fk = 54 AND ES.permShow = 1 ORDER BY EE.email_id DESC LIMIT 15 EXTRA ID KEY KEY_LEN POSSIBLE_KEYS REF ROWS SELECT_TYPE TABLE TYPE Using temporary; Using filesort 1 user_email 4 user_email,user_fk,status_fk const 180681 PRIMARY EE ref Using where; Using join buffer 1 [empty string] [empty string] PRIMARY [empty string] 6 PRIMARY ES ALL Using index 2 email_fk 4 group_email,group_fk,email_fk mailing_dev.EE.email_id 1 DEPENDENT SUBQUERY GEC ref Using where 2 PRIMARY 4 PRIMARY mailing_dev.GEC.group_fk 1 DEPENDENT SUBQUERY GC eq_ref SELECT EE.* , (SELECT GROUP_CONCAT(CONVERT(CONCAT(GC.name, '~', GC.group_id), CHAR(255)) SEPARATOR ',') FROM `group` GC INNER JOIN group_email GEC ON GEC.group_fk = GC.group_id WHERE GEC.email_fk = EE.email_id AND GC.deleted = 0) AS groups FROM `email__email` EE WHERE 1 = 1 AND EE.user_fk = 54 AND EXISTS(SELECT permShow FROM email__status WHERE status_id = EE.status_fk AND permShow = 1) ORDER BY EE.email_id DESC LIMIT 15 EXTRA ID KEY KEY_LEN POSSIBLE_KEYS REF ROWS SELECT_TYPE TABLE TYPE Using where 1 PRIMARY 4 user_email,user_fk [empty string] 270 PRIMARY EE index Using where 3 PRIMARY 4 PRIMARY mailing_dev.EE.status_fk 1 DEPENDENT SUBQUERY email__status eq_ref Using index 2 email_fk 4 group_email,group_fk,email_fk mailing_dev.EE.email_id 1 DEPENDENT SUBQUERY GEC ref Using where 2 PRIMARY 4 PRIMARY mailing_dev.GEC.group_fk 1 DEPENDENT SUBQUERY GC eq_ref 这两个查询之间有很大的区别,但第二个查询没有提供我需要获取的两个重要列。我可以做子查询来获取它们,就像连接一样,但我不希望每个子查询都有很多。。。有什么改进的办法吗

谢谢

email\uu email.status\u fk是一个tinyint,但是email\uu status.status\u id是一个int11


这可能会弄脏你的内心连接。更改一种或另一种数据类型,然后重试。

将两者都更改为tinyint2,然后再更改为int11,但不更改。。。我运行优化查询来检查基数,但仍然没有任何更改。解释保留在使用临时文件中;在状态_fk上使用文件排序。不过,我会遵守您关于数据一致性的建议