- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
mysql Ver 14.14 Distrib 5.1.58,用于使用 readline 5.1 的 redhat-linux-gnu (x86_64)
我正在接手一个旧项目。我被要求加快速度。我通过启用慢查询日志。我正在检查出现在慢查询日志中的查询。此查询需要 10 秒才能运行,并返回 11,000 行。
select
substring_index(ob1.literal,'/',1) AS sku4,
substring_index(
substring_index(ob1.literal,'/',2),'/',-(1)) AS sku5,
substring_index(
substring_index(ob1.literal,'/',3),'/',-(1)) AS sku6,
substring_index(ob2.literal,'/',1) AS sku7,
substring_index(
substring_index(ob2.literal,'/',2),'/',-(1)) AS sku8,
substring_index(
substring_index(ob2.literal,'/',3),'/',-(1)) AS sku9,concat_ws(',',ob.level_one,
substring_index(ob1.literal,'/',1),
substring_index(ob2.literal,'/',1)) AS sku1_filter,concat_ws(',',ob.level_two,
substring_index(
substring_index(ob1.literal,'/',2),'/',-(1)),
substring_index(
substring_index(ob2.literal,'/',2),'/',-(1))) AS sku2_filter,concat_ws(',',ob.level_three,
substring_index(
substring_index(ob1.literal,'/',3),'/',-(1)),
substring_index(
substring_index(ob2.literal,'/',3),'/',-(1))) AS sku3_filter,
t.title_id AS title_id,
t.us_list_price AS us_list_price,
t.uk_list_price AS uk_list_price,
t.can_list_price AS can_list_price,
t.aus_list_price AS aus_list_price,
t.min_age AS min_age,
t.max_age AS max_age,
t.book_club AS book_club,
t.best_seller AS best_seller,
t.award_winner AS award_winner,
t.asin AS asin,
t.format AS format,
ob.literal AS literal_1,
ob1.literal AS literal_2,
ob2.literal AS literal_3,
t.series AS series,
t.volume AS volume,
group_concat(distinct concat(u.first_name, ' ', u.last_name) separator ', ') AS marketer,
a.group_letter AS group_letter,
group_concat(distinct concat(u2.first_name, ' ', u2.last_name) separator ', ') AS editor,
oi.imprint_name AS imprint_name,
ob.level_one AS level_one,
ob.level_two AS level_two,
ob.level_three AS level_three,
ot1.territory_name AS rights,
(case when (isnull(t.active) or (t.active = ''))
then '' when (t.active = 'Y')
then 'Active' when (t.active = 'N')
then 'In Development' when (t.active = 'X')
then 'Terminated' when (t.active = 'T')
then 'Transmittal' end) AS status,
(case when (isnull(t.format) or (t.format = ''))
then '' when (t.format = 4)
then 'Ebook' when (t.format = 8)
then 'Print Book' when (t.format = 9)
then 'Audio Book' end) AS format_name,
t.title AS title,t.primary_isbn13 AS primary_isbn13,
group_concat(distinct a.display_name order by a.display_name ASC separator ', ') AS contributors,
group_concat(distinct c1.display_name order by c1.display_name ASC separator ', ') AS publishers,
t.publish_date AS pub_date,
group_concat(distinct g.name order by g.name ASC separator ', ') AS category,
group_concat(distinct g0.id order by g0.id ASC separator ', ') AS secondary_category_ids,
group_concat(distinct g0.name order by g0.name ASC separator ', ') AS secondary_categories
from ((((((((((((((((((((wawa_title t
left join wawa_title_to_imprint tti on((t.title_id = tti.title_id)))
left join wawa_imprint oi on((tti.imprint_id = oi.imprint_id)))
left join wawa_title_to_supplier t2a on((t2a.title_id = t.title_id)))
left join wawa_territories ot1 on((t.territory_id = ot1.territory_id)))
left join wawa_supplier a on((a.supplier_id = t2a.supplier_id)))
left join wawa_sku ob on((ob.code = t.sku1)))
left join wawa_sku ob1 on((ob1.code = t.sku2)))
left join wawa_sku ob2 on((ob2.code = t.sku3)))
left join bll_formats tf on((t.format = tf.id)))
left join bll_suppliers_to_wawa_editors aoe on((a.supplier_id = aoe.supplier_id)))
left join bll_suppliers_to_wawa_marketing_contacts amc on((a.supplier_id = amc.supplier_id)))
left join bll_contacts c0 on((c0.id = amc.id)))
left join users u on((amc.user_id = u.id)))
left join users u2 on((aoe.user_id = u2.id)))
join wawa_title_to_publisher t2p on((t2p.title_id = t.title_id)))
join wawa_publisher p on((p.publisher_id = t2p.publisher_id)))
join bll_contacts c1 on((c1.id = p.org_contact_id)))
left join wawa_title_to_genre t2g on((t2g.title_id = t.title_id)))
left join wawa_genres g on((g.id = t2g.genre_id_2)))
left join wawa_genres g0 on((g0.id = t2g.genre_id_3))) where ((t.title_id = t.title_id) and (t.active <> 'X'))
group by t.title_id
EXPLAIN 的输出是:
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | p | index | PRIMARY,org_contact_fk | org_contact_fk | 5 | NULL | 66 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | c1 | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.p.org_contact_id | 1 | |
| 1 | SIMPLE | t2p | ref | idx_title_id,idx_publisher_id | idx_publisher_id | 4 | wawa_ripple_development.p.publisher_id | 66 | Using where |
| 1 | SIMPLE | t | eq_ref | PRIMARY,active_index,idx_title_active_isprimary | PRIMARY | 4 | wawa_ripple_development.t2p.title_id | 1 | Using where |
| 1 | SIMPLE | t2g | ref | idx_title_id | idx_title_id | 4 | wawa_ripple_development.t2p.title_id | 1 | |
| 1 | SIMPLE | g | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.t2g.genre_id_2 | 1 | |
| 1 | SIMPLE | g0 | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.t2g.genre_id_3 | 1 | |
| 1 | SIMPLE | tti | ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.t.title_id | 1 | Using index |
| 1 | SIMPLE | oi | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.tti.imprint_id | 1 | |
| 1 | SIMPLE | t2a | ref | title_id | title_id | 4 | wawa_ripple_development.t.title_id | 1 | Using index |
| 1 | SIMPLE | ot1 | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.t.territory_id | 1 | |
| 1 | SIMPLE | a | eq_ref | PRIMARY,wawa_supplier_venue_id_supplier_id | PRIMARY | 4 | wawa_ripple_development.t2a.supplier_id | 1 | |
| 1 | SIMPLE | ob | eq_ref | PRIMARY | PRIMARY | 29 | wawa_ripple_development.t.sku1 | 1 | |
| 1 | SIMPLE | ob1 | eq_ref | PRIMARY | PRIMARY | 29 | wawa_ripple_development.t.sku2 | 1 | |
| 1 | SIMPLE | ob2 | eq_ref | PRIMARY | PRIMARY | 29 | wawa_ripple_development.t.sku3 | 1 | |
| 1 | SIMPLE | tf | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.t.format | 1 | Using index |
| 1 | SIMPLE | aoe | ref | idx_by_supplier_and_editor,index_bll_suppliers_to_wawa_editors_on_supplier_id | idx_by_supplier_and_editor | 4 | wawa_ripple_development.a.supplier_id | 1 | Using index |
| 1 | SIMPLE | amc | ref | idx_by_supplier_and_marketing_contact,index_bll_suppliers_to_wawa_marketing_contacts_on_supplier_id | idx_by_supplier_and_marketing_contact | 4 | wawa_ripple_development.a.supplier_id | 1 | Using index |
| 1 | SIMPLE | c0 | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.amc.id | 1 | Using index |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.amc.user_id | 1 | |
| 1 | SIMPLE | u2 | eq_ref | PRIMARY | PRIMARY | 4 | wawa_ripple_development.aoe.user_id | 1 | |
+----+-------------+-------+--------+-----------------------------------------------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+----------------------------------------------+
我担心两件事:
1.) 使用索引;使用临时的;使用文件排序
2.) 使用哪里
我担心这些是否正确?
有什么建议可以加快速度吗?
一些变量:
mysql> show variables like '%buffer%';
+-------------------------+---------+
| Variable_name | Value |
+-------------------------+---------+
| bulk_insert_buffer_size | 8388608 |
| innodb_buffer_pool_size | 8388608 |
| innodb_log_buffer_size | 1048576 |
| join_buffer_size | 131072 |
| key_buffer_size | 8384512 |
| myisam_sort_buffer_size | 8388608 |
| net_buffer_length | 16384 |
| preload_buffer_size | 32768 |
| read_buffer_size | 131072 |
| read_rnd_buffer_size | 262144 |
| sort_buffer_size | 2097144 |
| sql_buffer_result | OFF |
+-------------------------+---------+
最佳答案
EXPLAIN
中的位置并不表示哪个表真正需要 tmp 或 filesort。有关此类详细信息,请参阅 EXPLAIN FORMAT=JSON SELECT ...
。WHERE
正在使用一定的效率;这仅适用于较新的版本。EXPLAIN
来看,似乎往往更接近1:1。至于加速...
LEFT
吗?如果不摆脱它;优化器可能更喜欢其他一些表顺序。EXPLAIN
表示需要获取的行不多。 (注意:Explain 的“行”数字是近似值。)因此,我在这里看不到太多帮助。JOIN
创建“覆盖索引”——但仅针对“ref”情况执行此操作,而不是“eq_ref + PRIMARY”情况。看来您已经彻底完成了这项工作。SHOW VARIABLES LIKE '%buffer%';
-- 我正在钓鱼 memory utilization .JOIN
+ GROUP BY
-- 这通常意味着行爆炸,然后是内爆。将JOIN
的一些 更改为SELECT
中的子查询可能 改进:( SELECT ... FROM ... WHERE ... LIMIT 1 ) AS whatever
.TEXT
?这迫使“文件排序”超出内存(因此速度较慢)。给我更多详细信息,也许我们可以解决这个问题。总而言之,EXPLAIN
看起来很干净。大量的 JOIN
是另一回事。
两个可能糟糕的模式设计:
附录
对于 16GB RAM 和 InnoDB 和 MyISAM 的混合,建议 key_buffer_size = 1500M
和 innodb_buffer_pool_size = 5G
。在 my.cnf
(或 my.ini
)中设置它们并重新启动 mysqld
。
关于mysql - 如何避免MySQL中的 "Using index; Using temporary; Using filesort ",21表JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511673/
我有一个类似于以下内容的查询: SELECT * FROM tablename WHERE condition = 1 ORDER BY id LIMIT 1000; id是主键。我有一个索引 con
我有一些推荐表 CREATE TABLE IF NOT EXISTS `testimonials` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title
我有以下查询: SELECT * FROM shop_user_member_spots WHERE delete_flag = 0 ORDER BY date_spotte
我正在尝试创建一个选择查询,但是当我使用解释查询时,mysql 总是额外使用“使用文件排序”。 我尝试了最简单的查询,但问题并没有消失。我的表“Partidas”的结构是: CREATE TABLE
我有一个包含日期时间列的表,我按该列进行排序。无论我做什么,我总是从 EXPLAIN 中得到“使用哪里;使用文件排序”。 有没有办法让日期时间列上的 ORDER BY 不使用文件排序? 查询非常简单,
我在我的 Mysql 数据库上运行了一个 sql 查询。我有一张包含 150 万条记录的表。我正在尝试根据项目的创建者获取最近创建的 50 个项目。 这里是查询: SELECT * FROM `ite
mysql-5.6.24-win32.1432006610 我有两个用户消息表。 TMessageBody (id, body) 存储消息正文。 TMessage (id, uid, folderId
你好,这个查询正在生成这个解释,考虑到我为两列都设置了索引,这很奇怪 '1', 'SIMPLE', 'vtr_video_transactions', 'ALL', 'user_standard,us
我有一个简单的表格-> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY by_id INT UNSIGNED NOT NULL posted_o
我有一个像这样的表结构 comment_id primary key comment_content comment_author comment_author_url 当我像 这样触发查询时 exp
我有一个包含 40,000,000 行的表,我正在尝试优化我的查询,因为花费的时间太长。 首先,这是我的 table : 创建表 恢复 ( yearMonth char(6) DEFAULT NULL
我正在尝试优化使用 order by 子句的 sql 查询。当我使用 EXPLAIN 时,查询总是显示“使用文件排序”。我正在将此查询应用于一个群组讨论论坛,其中有用户附加到帖子的标签。 这是我正在使
我正在尝试优化此查询: SELECT `posts`.* FROM `posts` INNER JOIN `posts_tags` ON `posts`.id = `posts_tags`.
子查询1: SELECT * from big_table where category = 'fruits' and name = 'apple' order by yyyymmdd desc 解释
我有一个查询比这个查询稍微复杂一点(获得最便宜的价格),但这代表了性能问题。因此查询不能更改。 我尝试创建不同的索引来加快排序速度,但没有运气。 需要什么索引才能更快地获得这个 1.4 秒的持久查询?
我有一张带有日期时间 (DATE) 和位 (PUBLIC) 的 Cars 表。 现在我想获取按 DATE 和 PUBLIC = 1 排序的行,所以我使用: select c.* from Ca
我有如下 2 个表: CREATE TABLE `ox_campaigns` ( `
我正在尝试使用 EXPLAIN 优化此 mysql 查询。有人可以帮我解决这个问题吗? EXPLAIN SELECT * FROM keyword WHERE keyword LIKE "panaso
有表格: CREATE TABLE `deal_keyword` ( `deal_id` int(11) unsigned NOT NULL default '0', `keyword_id`
我将用这样的查询来解释自己:(post_id= PRIMARY, blog_id=index ) SELECT post_id FROM posts WHERE blog_id IN (2,3,...
我是一名优秀的程序员,十分优秀!