问题
I am using the following query:
SELECT *,
GROUP_CONCAT(distinct t_name order by t_id separator ', ') 'Topics',
GROUP_CONCAT(distinct ch_title order by ch_id separator ', ') 'Chapters',
GROUP_CONCAT(distinct cs_code order by cs_id separator ', ') 'ContentStandards',
GROUP_CONCAT(distinct c_name order by c_id separator ', ') 'Categories',
GROUP_CONCAT(distinct s_name order by s_id separator ', ') 'SchoolSubjects'
FROM (
SELECT r.res_id, r.res_status, r.res_type, r.res_category, r.res_title, r.res_filename, r.res_source, r.res_gradelevel_from, r.res_gradelevel_to, r.res_tags, r.res_description, r.res_onserver, r.res_favoriteaccts, r.res_CreatedOn, c_id, s_id, t_id, ch_id, cs_id,
CONCAT("<a class=""ReportLink"" href=""page.asp?category=",c_name,""" title=""",c_name,""">",c_name,"</a>") as c_name,
CONCAT("<a class=""ReportLink"" href=""page.asp?subject=",s_name,""" title=""",s_name,""">",s_name,"</a>") as s_name,
CONCAT("<a class=""ReportLink"" href=""page.asp?topic=",t_name,""" title=""",t_name,""">",t_name,"</a>") as t_name,
CONCAT("<a class=""ReportLink"" href=""page.asp?cs=",cs_code,""" title=""",cs_code,""">",cs_code,"</a>") as cs_code,
CONCAT("<a class=""ReportLink"" href=""page.asp?chapter=",ch_title,""" title=""",ch_title,""">",ch_code,": ",ch_title,"</a>") as ch_title
FROM hre_resources r
LEFT JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id
LEFT JOIN topics t on t.t_id = ttr.rt_topicid
LEFT JOIN topic_to_cs tcs on tcs.cst_topicid = t.t_id
LEFT JOIN categories c ON c_id = r.res_category
LEFT JOIN topic_to_framework ttc on ttc.ft_topicid = t.t_id
LEFT JOIN ca_hss_frameworkchapters ch ON ch.ch_id = ttc.ft_frameworkid
LEFT JOIN ca_hss_contentstandards cs ON cs.cs_id = tcs.cst_contentstandardid
LEFT JOIN schoolsubjects_to_resource str ON str.sr_resid = r.res_id
LEFT JOIN schoolsubjects s ON s.s_id = str.sr_sid) links
WHERE RES_Status = 'Active'
GROUP BY RES_ID
ORDER BY RES_Title ASC, RES_Source DESC
This query returns 64 perfectly formatted records from our mySQL DB, but it takes over 100 seconds to do this.
The query profiler shows the key offenders as:
+-------------------------------+-----------+
| Sending data | 34.530026 |
+-------------------------------+-----------+
| Creating sort index | 24.205878 |
| Storing result in query cache | 56.739204 |
+-------------------------------+-----------+
The EXPLAIN results are below:
+----+-------------+------------+--------+---------------+---------------+---------+------------------------------------+------+---------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+---------------+---------+------------------------------------+------+---------------------------------------------------------------------+
| 1 | PRIMARY | <derived2> | ref | <auto_key0> | <auto_key0> | 77 | const | 10 | Using index condition; Using where; Using temporary; Using filesort |
| 2 | DERIVED | r | ALL | NULL | NULL | NULL | NULL | 64 | NULL |
| 2 | DERIVED | ttr | ref | RT_ResourceID | RT_ResourceID | 4 | uhri_hre.r.RES_ID | 3 | Using where |
| 2 | DERIVED | t | eq_ref | PRIMARY | PRIMARY | 4 | uhri_hre.ttr.RT_TopicID | 1 | Using where |
| 2 | DERIVED | tcs | ref | CST_TopicID | CST_TopicID | 4 | uhri_hre.t.T_ID | 9 | Using where |
| 2 | DERIVED | c | eq_ref | PRIMARY | PRIMARY | 4 | uhri_hre.r.RES_Category | 1 | Using where |
| 2 | DERIVED | ttc | ref | FT_TopicID | FT_TopicID | 4 | uhri_hre.t.T_ID | 21 | Using where |
| 2 | DERIVED | ch | eq_ref | PRIMARY | PRIMARY | 4 | uhri_hre.ttc.FT_FrameworkID | 1 | Using where |
| 2 | DERIVED | cs | eq_ref | PRIMARY | PRIMARY | 4 | uhri_hre.tcs.CST_ContentStandardID | 1 | Using where |
| 2 | DERIVED | str | ref | SR_RESID | SR_RESID | 4 | uhri_hre.r.RES_ID | 1 | Using where |
| 2 | DERIVED | s | eq_ref | PRIMARY | PRIMARY | 4 | uhri_hre.str.SR_SID | 1 | Using where |
+----+-------------+------------+--------+---------------+---------------+---------+------------------------------------+------+---------------------------------------------------------------------+
The tables have the following indexes. Tables not listed have indexes on the ID field (Primary Key):
HRE_Resources:
+--------------+-------+--------+--------+--------------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+--------------+-------+--------+--------+--------------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | RES_ID | 64 | A | | |
| RES_Type | BTREE | No | No | RES_Type | 4 | A | | |
| RES_Category | BTREE | No | No | RES_Category | 10 | A | | |
| RES_Status | BTREE | No | No | RES_Status | 4 | A | | |
| RES_Language | BTREE | No | No | RES_Language | 8 | A | | |
| RES_Source | BTREE | No | No | RES_Source | 21 | A | | |
+--------------+-------+--------+--------+--------------+-------------+-----------+------+---------+
Topics:
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | T_ID | 39 | A | | |
| T_Name | BTREE | No | No | T_Name | 39 | A | | |
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
Topic_to_CS:
+-----------------------+-------+--------+--------+-----------------------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+-----------------------+-------+--------+--------+-----------------------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | CST_ID | 685 | A | | |
| CST_ContentStandardID | BTREE | No | No | CST_ContentStandardID | 228 | A | | |
| CST_TopicID | BTREE | No | No | CST_TopicID | 76 | A | | |
+-----------------------+-------+--------+--------+-----------------------+-------------+-----------+------+---------+
Topic_to_Framework:
+----------------+-------+--------+--------+----------------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+----------------+-------+--------+--------+----------------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | FT_ID | 471 | A | | |
| FT_TopicID | BTREE | No | No | FT_TopicID | 22 | A | | |
| FT_FrameworkID | BTREE | No | No | FT_FrameworkID | 235 | A | | |
+----------------+-------+--------+--------+----------------+-------------+-----------+------+---------+
Topic_to_Resource:
+---------------+-------+--------+--------+---------------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+---------------+-------+--------+--------+---------------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | RT_ID | 387 | A | | |
| RT_ResourceID | BTREE | No | No | RT_ResourceID | 129 | A | | |
| RT_TopicID | BTREE | No | No | RT_TopicID | 77 | A | | |
+---------------+-------+--------+--------+---------------+-------------+-----------+------+---------+
Schoolsubject_to_Resource:
+----------+-------+--------+--------+----------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+----------+-------+--------+--------+----------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | SR_ID | 228 | A | | |
| SR_SID | BTREE | No | No | SR_SID | 25 | A | | |
| SR_RESID | BTREE | No | No | SR_RESID | 228 | A | | |
+----------+-------+--------+--------+----------+-------------+-----------+------+---------+
Categories:
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
| Keyname | Type | Unique | Packed | Column | Cardinality | Collation | Null | Comment |
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
| PRIMARY | BTREE | Yes | No | C_ID | 9 | A | | |
| C_Name | BTREE | No | No | C_Name | 9 | A | | |
+---------+-------+--------+--------+--------+-------------+-----------+------+---------+
Some of these indexes are created with more complicated WHEREs that are used in other queries.
I have run complex queries on the DB for other purposes that have nothing to do with the query above and it's performing nominally. As such, I don't think it's a server resources issue.
Can anyone see anything in the query above that might be causing such a slow response?
Many thanks in advance!
PS. Adding some info from the server per a request below...
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 1048576 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+---------+
+-------------------------+--------+
| Variable_name | Value |
+-------------------------+--------+
| Qcache_free_blocks | 9 |
| Qcache_free_memory | 22736 |
| Qcache_hits | 121910 |
| Qcache_inserts | 9296 |
| Qcache_lowmem_prunes | 8213 |
| Qcache_not_cached | 29475 |
| Qcache_queries_in_cache | 103 |
| Qcache_total_blocks | 295 |
+-------------------------+--------+
回答1:
As I mentioned in the comments above, you seem to be fetching a lot of data from multiple table relationships. This causes several Cartesian products, which is why you get the 626K rows.
The solution is to break this up into individual queries.
Here's what I understand about your model:
Here's what the individual queries would look like, with their respective EXPLAIN plans.
You can see that this eliminates all subqueries and temp tables, it eliminates the Cartesian products so you don't need to use DISTINCT anywhere, and all joins are nicely against primary keys. It might seem repetitive, but the fact that the queries are better optimized should make it run faster.
EXPLAIN
SELECT r.res_id, r.res_status, r.res_type, r.res_category, r.res_title, r.res_filename,
r.res_source, r.res_gradelevel_from, r.res_gradelevel_to, r.res_tags, r.res_description,
r.res_onserver, r.res_favoriteaccts, r.res_CreatedOn, c.c_name AS 'Categories'
FROM hre_resources AS r
INNER JOIN categories c ON c_id = r.res_category
WHERE r.res_status = 'Active'
--------------
+----+-------------+-------+--------+-------------------------+------------+---------+---------------------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------+------------+---------+---------------------+------+-----------------------+
| 1 | SIMPLE | r | ref | res_status,res_category | res_status | 1 | const | 1 | Using index condition |
| 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 4 | test.r.res_category | 1 | NULL |
+----+-------------+-------+--------+-------------------------+------------+---------+---------------------+------+-----------------------+
EXPLAIN
SELECT r.res_id, GROUP_CONCAT(s.s_name ORDER BY s.s_id SEPARATOR ', ') AS 'SchoolSubjects'
FROM hre_resources AS r
INNER JOIN schoolsubjects_to_resource str ON str.sr_resid = r.res_id
INNER JOIN schoolsubjects s ON s.s_id = str.sr_sid
WHERE r.res_status = 'Active'
GROUP BY r.res_id
--------------
+----+-------------+-------+--------+---------------------------------+------------+---------+-----------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------------------------+------------+---------+-----------------+------+--------------------------+
| 1 | SIMPLE | r | ref | PRIMARY,res_status,res_category | res_status | 1 | const | 1 | Using where; Using index |
| 1 | SIMPLE | str | ref | PRIMARY,sr_sid | PRIMARY | 4 | test.r.res_id | 1 | Using index |
| 1 | SIMPLE | s | eq_ref | PRIMARY | PRIMARY | 4 | test.str.sr_sid | 1 | NULL |
+----+-------------+-------+--------+---------------------------------+------------+---------+-----------------+------+--------------------------+
3 rows in set (0.00 sec)
--------------
EXPLAIN
SELECT r.res_id, GROUP_CONCAT(t.t_name ORDER BY t_id SEPARATOR ', ') AS 'Topics'
FROM hre_resources AS r
INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id
INNER JOIN topics t on t.t_id = ttr.rt_topicid
WHERE r.res_status = 'Active'
GROUP BY r.res_id
--------------
+----+-------------+-------+--------+---------------------------------+------------+---------+---------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------------------------+------------+---------+---------------------+------+--------------------------+
| 1 | SIMPLE | r | ref | PRIMARY,res_status,res_category | res_status | 1 | const | 1 | Using where; Using index |
| 1 | SIMPLE | ttr | ref | PRIMARY,rt_topicid | PRIMARY | 4 | test.r.res_id | 1 | Using index |
| 1 | SIMPLE | t | eq_ref | PRIMARY | PRIMARY | 4 | test.ttr.rt_topicid | 1 | NULL |
+----+-------------+-------+--------+---------------------------------+------------+---------+---------------------+------+--------------------------+
3 rows in set (0.00 sec)
--------------
EXPLAIN
SELECT r.res_id, GROUP_CONCAT(DISTINCT CONCAT(ch.ch_code, ':', ch.ch_title) ORDER BY ch.ch_id SEPARATOR ', ') AS 'Chapters'
FROM hre_resources AS r
INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id
INNER JOIN topics t on t.t_id = ttr.rt_topicid
INNER JOIN topic_to_framework ttc on ttc.ft_topicid = t.t_id
INNER JOIN ca_hss_frameworkchapters ch ON ch.ch_id = ttc.ft_frameworkid
WHERE r.res_status = 'Active'
GROUP BY r.res_id
--------------
+----+-------------+-------+--------+---------------------------------+------------+---------+-------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------------------------+------------+---------+-------------------------+------+--------------------------+
| 1 | SIMPLE | r | ref | PRIMARY,res_status,res_category | res_status | 1 | const | 1 | Using where; Using index |
| 1 | SIMPLE | ttr | ref | PRIMARY,rt_topicid | PRIMARY | 4 | test.r.res_id | 1 | Using index |
| 1 | SIMPLE | t | eq_ref | PRIMARY | PRIMARY | 4 | test.ttr.rt_topicid | 1 | Using index |
| 1 | SIMPLE | ttc | ref | PRIMARY,ft_frameworkid | PRIMARY | 4 | test.ttr.rt_topicid | 1 | Using index |
| 1 | SIMPLE | ch | eq_ref | PRIMARY | PRIMARY | 4 | test.ttc.ft_frameworkid | 1 | NULL |
+----+-------------+-------+--------+---------------------------------+------------+---------+-------------------------+------+--------------------------+
5 rows in set (0.00 sec)
--------------
EXPLAIN
SELECT r.res_id, GROUP_CONCAT(DISTINCT cs.cs_code ORDER BY cs.cs_id SEPARATOR ', ') AS 'ContentStandards'
FROM hre_resources AS r
INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id
INNER JOIN topics t on t.t_id = ttr.rt_topicid
INNER JOIN topic_to_cs tcs on tcs.cst_topicid = t.t_id
INNER JOIN ca_hss_contentstandards cs ON cs.cs_id = tcs.cst_contentstandardid
WHERE r.res_status = 'Active'
GROUP BY r.res_id
--------------
+----+-------------+-------+--------+---------------------------------+------------+---------+--------------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------------------------+------------+---------+--------------------------------+------+--------------------------+
| 1 | SIMPLE | r | ref | PRIMARY,res_status,res_category | res_status | 1 | const | 1 | Using where; Using index |
| 1 | SIMPLE | ttr | ref | PRIMARY,rt_topicid | PRIMARY | 4 | test.r.res_id | 1 | Using index |
| 1 | SIMPLE | t | eq_ref | PRIMARY | PRIMARY | 4 | test.ttr.rt_topicid | 1 | Using index |
| 1 | SIMPLE | tcs | ref | PRIMARY,cst_contentstandardid | PRIMARY | 4 | test.ttr.rt_topicid | 1 | Using index |
| 1 | SIMPLE | cs | eq_ref | PRIMARY | PRIMARY | 4 | test.tcs.cst_contentstandardid | 1 | NULL |
+----+-------------+-------+--------+---------------------------------+------------+---------+--------------------------------+------+--------------------------+
Below is the DDL I assumed for the tables. It would have been helpful if you had included this in your original question.
CREATE TABLE categories (
c_id INT PRIMARY KEY,
c_name VARCHAR(100) NOT NULL DEFAULT 'c_name'
);
CREATE TABLE hre_resources (
res_id INT PRIMARY KEY,
res_category INT NOT NULL,
res_status ENUM('Active', 'Inactive') NOT NULL DEFAULT 'Active',
res_type VARCHAR(100) NOT NULL DEFAULT 'type',
res_title VARCHAR(100) NOT NULL DEFAULT 'title',
res_filename VARCHAR(100) NOT NULL DEFAULT '',
res_source VARCHAR(100) NOT NULL DEFAULT '',
res_gradelevel_from VARCHAR(100) NOT NULL DEFAULT '',
res_gradelevel_to VARCHAR(100) NOT NULL DEFAULT '',
res_tags VARCHAR(100) NOT NULL DEFAULT '',
res_description VARCHAR(100) NOT NULL DEFAULT '',
res_onserver VARCHAR(100) NOT NULL DEFAULT '',
res_favoriteaccts VARCHAR(100) NOT NULL DEFAULT '',
res_CreatedOn DATE NOT NULL DEFAULT '2017-01-01',
KEY (res_status),
FOREIGN KEY (res_category) REFERENCES categories(c_id)
);
CREATE TABLE topics (
t_id INT PRIMARY KEY,
t_name VARCHAR(100) NOT NULL DEFAULT 't_name'
);
CREATE TABLE ca_hss_frameworkchapters (
ch_id INT PRIMARY KEY,
ch_title VARCHAR(100) NOT NULL DEFAULT 'ch_title',
ch_code VARCHAR(100) NOT NULL DEFAULT 'ch_code'
);
CREATE TABLE ca_hss_contentstandards (
cs_id INT PRIMARY KEY,
cs_code VARCHAR(100) NOT NULL DEFAULT 'cs_code'
);
CREATE TABLE schoolsubjects (
s_id INT PRIMARY KEY,
s_name VARCHAR(100) NOT NULL DEFAULT 's_name'
);
CREATE TABLE topic_to_framework (
ft_topicid INT NOT NULL,
ft_frameworkid INT NOT NULL,
PRIMARY KEY (ft_topicid, ft_frameworkid),
FOREIGN KEY (ft_topicid) REFERENCES topics(t_id),
FOREIGN KEY (ft_frameworkid) REFERENCES ca_hss_frameworkchapters(ch_id)
);
CREATE TABLE topic_to_resource (
rt_resourceid INT NOT NULL,
rt_topicid INT NOT NULL,
PRIMARY KEY (rt_resourceid, rt_topicid),
FOREIGN KEY (rt_resourceid) REFERENCES hre_resources (res_id),
FOREIGN KEY (rt_topicid) REFERENCES topics(t_id)
);
CREATE TABLE topic_to_cs (
cst_topicid INT NOT NULL,
cst_contentstandardid INT NOT NULL,
PRIMARY KEY (cst_topicid, cst_contentstandardid),
FOREIGN KEY (cst_topicid) REFERENCES topics(t_id),
FOREIGN KEY (cst_contentstandardid) REFERENCES ca_hss_contentstandards(cs_id)
);
CREATE TABLE schoolsubjects_to_resource (
sr_resid INT NOT NULL,
sr_sid INT NOT NULL,
PRIMARY KEY (sr_resid, sr_sid),
FOREIGN KEY (sr_resid) REFERENCES hre_resources(res_id),
FOREIGN KEY (sr_sid) REFERENCES schoolsubjects(s_id)
);
Here's an example in Python of what I mean by merging the results of multiple queries together.
import pprint
import MySQLdb
import MySQLdb.cursors
db = MySQLdb.connect(host="localhost", db="test", cursorclass=MySQLdb.cursors.DictCursor)
cur = db.cursor()
res_data = {}
sql = """SELECT r.res_id, r.res_status, r.res_type, r.res_category, r.res_title, r.res_filename, r.res_source, r.res_gradelevel_from, r.res_gradelevel_to, r.res_tags, r.res_description, r.res_onserver, r.res_favoriteaccts, r.res_CreatedOn, c.c_name AS 'Categories' FROM hre_resources AS r INNER JOIN categories c ON c_id = r.res_category WHERE r.res_status = 'Active'"""
cur.execute(sql)
for row in cur.fetchall():
res_data[row['res_id']] = row
sql = """SELECT r.res_id, GROUP_CONCAT(s.s_name ORDER BY s.s_id SEPARATOR ', ') AS 'SchoolSubjects' FROM hre_resources AS r INNER JOIN schoolsubjects_to_resource str ON str.sr_resid = r.res_id INNER JOIN schoolsubjects s ON s.s_id = str.sr_sid WHERE r.res_status = 'Active' GROUP BY r.res_id"""
cur.execute(sql)
for row in cur.fetchall():
res_data[row['res_id']].update(row)
sql = """SELECT r.res_id, GROUP_CONCAT(t.t_name ORDER BY t_id SEPARATOR ', ') AS 'Topics' FROM hre_resources AS r INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id INNER JOIN topics t on t.t_id = ttr.rt_topicid WHERE r.res_status = 'Active' GROUP BY r.res_id"""
cur.execute(sql)
for row in cur.fetchall():
res_data[row['res_id']].update(row)
sql = """SELECT r.res_id, GROUP_CONCAT(DISTINCT CONCAT(ch.ch_code, ':', ch.ch_title) ORDER BY ch.ch_id SEPARATOR ', ') AS 'Chapters' FROM hre_resources AS r INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id INNER JOIN topics t on t.t_id = ttr.rt_topicid INNER JOIN topic_to_framework ttc on ttc.ft_topicid = t.t_id INNER JOIN ca_hss_frameworkchapters ch ON ch.ch_id = ttc.ft_frameworkid WHERE r.res_status = 'Active' GROUP BY r.res_id"""
cur.execute(sql)
for row in cur.fetchall():
res_data[row['res_id']].update(row)
sql = """SELECT r.res_id, GROUP_CONCAT(DISTINCT cs.cs_code ORDER BY cs.cs_id SEPARATOR ', ') AS 'ContentStandards' FROM hre_resources AS r INNER JOIN topic_to_resource ttr ON ttr.rt_resourceid = r.res_id INNER JOIN topics t on t.t_id = ttr.rt_topicid INNER JOIN topic_to_cs tcs on tcs.cst_topicid = t.t_id INNER JOIN ca_hss_contentstandards cs ON cs.cs_id = tcs.cst_contentstandardid WHERE r.res_status = 'Active' GROUP BY r.res_id"""
cur.execute(sql)
for row in cur.fetchall():
res_data[row['res_id']].update(row)
db.close()
pp = pprint.PrettyPrinter()
pp.pprint(res_data)
After I added one row of fake data to each table, I got this output from the script above:
{2L: {'Categories': 'c_name',
'Chapters': 'ch_codech_title',
'ContentStandards': 'cs_code',
'SchoolSubjects': 's_name',
'Topics': 't_name',
'res_CreatedOn': datetime.date(2017, 1, 1),
'res_category': 1L,
'res_description': '',
'res_favoriteaccts': '',
'res_filename': '',
'res_gradelevel_from': '',
'res_gradelevel_to': '',
'res_id': 2L,
'res_onserver': '',
'res_source': '',
'res_status': 'Active',
'res_tags': '',
'res_title': 'title',
'res_type': 'type'}}
回答2:
Start by pulling WHERE RES_Status = 'Active'
inside the derived table. That may significantly decrease the size of the tmp table and may significantly shrink the "Creating sort index" phase.
Then focus on the derived table. Separate it out. How long does it take?
As for the 56.7s part, it sounds like some settings are too high. Please provide:
SHOW VARIABLES LIKE 'query%';
SHOW GLOBAL STATUS LIKE 'Qc%';
来源:https://stackoverflow.com/questions/46716622/mysql-very-slow-query-with-concat-group-concat-and-multiple-joins-100-sec-f