Доброго времени суток.
Есть:
Server version: 6.3.6 593045790@24080214 (columnar 2.3.0 88a01c3@24052206) (secondary 2.3.0 88a01c3@24052206) (knn 2.3.0 88a01c3@24052206) git branch manticore-6.3.6...origin/manticore-6.3.6
1 сервер (8 CPU, 12 GB RAM) и индексы RT.
Индексы:
products
mysql> desc products;
+--------------------------------------------------+-----------+----------------+
| Field | Type | Properties |
+--------------------------------------------------+-----------+----------------+
| id | bigint | |
| name | text | stored |
| slug | text | stored |
| description | text | stored |
| selling_text | text | stored |
| reasons_to_buy | text | stored |
| additional_images | text | stored |
| school_umk_title | text | indexed stored |
| seo_description | text | stored |
| relations_set | text | indexed stored |
| author_full_name_list | text | indexed stored |
| publisher_series_name | text | indexed stored |
| publisher_name | text | indexed stored |
| publisher_brand_name | text | indexed stored |
| manufacturer_name | text | indexed stored |
| manufacturer_brand_name | text | indexed stored |
| image | string | |
| price_retail | float | |
| price_discounted_for_guest | float | |
| price_discount_percent_for_guest | float | |
| price_discounted_for_authorized | float | |
| price_discount_percent_for_authorized | float | |
| price_discounted_for_subscriber | float | |
| price_discount_percent_for_subscriber | float | |
| marketing_status_list | mva | |
| availability_status | uint | |
| availability_quantity | uint | |
| vendor_id | uint | |
| nds | uint | |
| reasons_to_buy_list | json | |
| literature_work_publishing_year | uint | |
| preorder_available_at | timestamp | |
| released_at | timestamp | |
| created_at | timestamp | |
| isbns | string | |
| printing_page_count | uint | |
| printing_page_format | string | |
| printing_copy_count | uint | |
| weight | uint | |
| height | uint | |
| width | uint | |
| length | uint | |
| excerpts | json | |
| rating_average | float | |
| rating_weight | uint | |
| rating_star | uint | |
| rating_count | uint | |
| review_count | uint | |
| purchase_stats_week_count | uint | |
| purchase_stats_month_count | uint | |
| purchase_stats_year_count | uint | |
| purchase_stats_day_avg_count | uint | |
| sales_stat_year_turnover_amount_without_vat | float | |
| sales_stat_year_turnover_quantity | uint | |
| sales_stat_year_markup | float | |
| sales_stat_half_year_turnover_amount_without_vat | float | |
| sales_stat_half_year_turnover_quantity | uint | |
| sales_stat_half_year_markup | float | |
| sales_stat_quarter_turnover_amount_without_vat | float | |
| sales_stat_quarter_turnover_quantity | uint | |
| sales_stat_quarter_markup | float | |
| sales_stat_month_turnover_amount_without_vat | float | |
| sales_stat_month_turnover_quantity | uint | |
| sales_stat_month_markup | float | |
| school_grade_id_list | mva | |
| school_subject_id_list | mva | |
| school_material_type_id_list | mva | |
| school_exam_id_list | mva | |
| school_education_system_id_list | mva | |
| school_umk_id_list | mva | |
| school_exam_year_id_list | mva | |
| school_purpose_id_list | mva | |
| seo_title | string | |
| main_category_id_list | mva | |
| category_id_list | mva | |
| tbk_id_list | mva | |
| ekn_id_list | mva | |
| author_id_list | mva | |
| translator_id_list | mva | |
| illustrator_id_list | mva | |
| publisher_series_id | uint | |
| publisher_id | uint | |
| publisher_brand_id | uint | |
| manufacturer_id | uint | |
| manufacturer_brand_id | uint | |
| literature_work_cycle_id | uint | |
| literature_work_cycle_volume_id | uint | |
| age_restriction | bigint | |
| binding_id | uint | |
| tag_id_list | mva | |
| product_set_id_list | mva | |
| product_type_id | uint | |
| article_number_id | uint | |
| product_type_id_list | mva | |
| article_number_id_list | mva | |
| stationery_brush_shape_id_list | mva | |
| stationery_brush_material_id_list | mva | |
| stationery_brush_number_id_list | mva | |
| stationery_painting_technique_id_list | mva | |
| stationery_lead_hardness_id_list | mva | |
| stationery_format_id_list | mva | |
| stationery_line_type_id_list | mva | |
| stationery_ink_color_id_list | mva | |
| stationery_lead_diameter_id_list | mva | |
| stationery_case_shape_id_list | mva | |
| stationery_mechanism_type_id_list | mva | |
| stationery_diameter_id_list | mva | |
| stationery_feature_id_list | mva | |
| stationery_colors_quantity_id_list | mva | |
| stationery_gender_id_list | mva | |
| stationery_length_id_list | mva | |
| stationery_staple_number_id_list | mva | |
| stationery_stapler_number_id_list | mva | |
| stationery_material_id_list | mva | |
| stationery_punched_sheets_quantity_id_list | mva | |
| stationery_pen_thickness_id_list | mva | |
| stationery_mounting_type_id_list | mva | |
| stationery_pen_tip_shape_id_list | mva | |
| stationery_ink_base_id_list | mva | |
| stationery_calculator_capacity_id_list | mva | |
| stationery_calendar_year_id_list | mva | |
| stationery_calendar_type_id_list | mva | |
| stationery_calendar_subject_id_list | mva | |
| stationery_clasp_type_id_list | mva | |
| stationery_compartments_quantity_id_list | mva | |
| stationery_cover_binding_id_list | mva | |
| stationery_package_type_id_list | mva | |
| stationery_cover_surface_id_list | mva | |
| stationery_universal_id_list | mva | |
| stationery_sheets_quantity_id_list | mva | |
| stationery_color_id_list | mva | |
| stationery_volume_id_list | mva | |
| comic_universal_id_list | mva | |
| comic_character_id_list | mva | |
| comic_genre_id_list | mva | |
| comic_series_id_list | mva | |
| comic_type_id_list | mva | |
| comic_line_id_list | mva | |
| comic_section_id_list | mva | |
| comic_subject_id_list | mva | |
| game_player_quantity_id_list | mva | |
| game_use_case_id_list | mva | |
| game_skill_id_list | mva | |
| game_audience_id_list | mva | |
| game_child_age_id_list | mva | |
| game_series_id_list | mva | |
| game_duration_id_list | mva | |
| constructor_detail_quantity_id_list | mva | |
| constructor_nation_id_list | mva | |
| constructor_equipment_type_id_list | mva | |
| souvenir_reason_id_list | mva | |
| souvenir_format_id_list | mva | |
| souvenir_set_quantity_id_list | mva | |
| toy_type_id_list | mva | |
| toy_height_id_list | mva | |
| gift_hobby_id_list | mva | |
| gift_for_children_id_list | mva | |
| gift_new_year_id_list | mva | |
| gift_section_id_list | mva | |
| gift_books_on_interest_id_list | mva | |
| product_collection_id_list | mva | |
| shop_id_list | mva | |
| city_id_list | mva | |
| shop_brand_id_list | mva | |
| active_shops_id_list | mva | |
| active_cities_id_list | mva | |
| active_shop_brands_id_list | mva | |
| all_shops_id_list | mva | |
| all_cities_id_list | mva | |
| all_shop_brands_id_list | mva | |
| videos | json | |
| attended_foreign_agents | json | |
| synchronized_at | timestamp | |
| updated_at | timestamp | |
| price_retail_min | float | |
| price_purchase | float | |
| common_language_id_list | mva | |
| common_audience_id_list | mva | |
| book_sub_genre_id_list | mva | |
| book_publication_type_id_list | mva | |
| book_literature_work_country_id_list | mva | |
+--------------------------------------------------+-----------+----------------+
181 rows in set (0,00 sec)
Количество:
mysql> select count(*) from products;
+----------+
| count(*) |
+----------+
| 2048293 |
+----------+
и
customer_products_bookmarks
mysql> desc customer_products_bookmarks;
+-------------+-----------+------------+
| Field | Type | Properties |
+-------------+-----------+------------+
| id | bigint | |
| customer_id | uint | |
| product_id | uint | |
| created_at | timestamp | |
+-------------+-----------+------------+
4 rows in set (0,00 sec)
Количество:
mysql> select count(*) from customer_products_bookmarks;
+----------+
| count(*) |
+----------+
| 64298313 |
Запрос:
SELECT id
FROM products
inner join customer_products_bookmarks on products.id = customer_products_bookmarks.product_id
LIMIT 10
option max_matches = 10
Проверка с profiling:
mysql> SET profiling=1;
Query OK, 0 rows affected (0,00 sec)
mysql> SELECT id FROM products inner join customer_products_bookmarks on products.id = customer_products_bookmarks.product_id ORDER BY id DESC LIMIT 10 OPTION max_matches = 10;
+---------+
| id |
+---------+
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
| 9502061 |
+---------+
10 rows in set, 1 warning (18,81 sec)
--- 10 out of 15271829 results in 18s 814ms ---
mysql> SHOW PROFILE;
+---------------+-----------+----------+---------+
| Status | Duration | Switches | Percent |
+---------------+-----------+----------+---------+
| unknown | 0.000163 | 6 | 0.00 |
| local_search | 0.003331 | 2 | 0.00 |
| sql_parse | 0.000610 | 1 | 0.00 |
| setup_iter | 0.000014 | 16 | 0.00 |
| fullscan | 73.487250 | 17 | 86.87 |
| dict_setup | 0.000003 | 1 | 0.00 |
| parse | 0.000003 | 1 | 0.00 |
| init | 0.000174 | 4 | 0.00 |
| finalize | 11.099995 | 10 | 13.12 |
| clone_attrs | 0.000194 | 1 | 0.00 |
| aggregate | 0.002001 | 3 | 0.00 |
| net_write | 0.000068 | 2 | 0.00 |
| eval_post | 0.000036 | 1 | 0.00 |
| eval_getfield | 0.000001 | 1 | 0.00 |
| total | 84.593843 | 66 | 0 |
+---------------+-----------+----------+---------+
15 rows in set (0,00 sec)
При выполнении только 1 запроса CPU по всем ядрам в 100%. Запрос в итоге выполнился, но цена высока. Несколько запросов и сервис ляжет.
И на основе результата в SHOW PROFILE видно высокое использование fullscan в 86.87% от общего результата.
Что можно с этим сделать?
Какого влияние join_batch_size? На уровне OPTION join_batch_size он не работает:
ERROR 1064 (42000): unknown option 'join_batch_size'
Хотя по документации указано, что можно задать не только в конфигурации, но и запросе.