Johan, your suggestion to tweak max_heap_table_size and tmp_table_size
fixed the issue. Bumping them both to 512MB got our performance back
on-par. I came up with a way to avoid the contention using a complex set of
temp tables, but performance was abysmal.

By reverting to the more straight-forward query with the subselect as well
as tweaking the max_healp_table_size and tmp_table_size I saw no resource
contention causing slowdowns, as well as a 12x performance boost. Thanks
for your help!

*Brad Heller *| Engineering Lead | Cloudability.com | 541-231-1514 | Skype:
brad.heller | @bradhe <http://www.twitter.com/bradhe> |
@cloudability<http://www.twitter.com/cloudability>


On Sun, Aug 11, 2013 at 1:32 PM, Johan De Meersman <vegiv...@tuxera.be>wrote:

> True, which is why I said I suspected file-based sort :-) At one million
> rows, that seems to be an accurate guess, too. Still on the phone, though,
> and in bed. I'll read the thread better tomorrow, but you might get some
> benefit from cutting out the subselect if that's possible.
>
> If you have plenty of memory, have a look at the max_temp_table_size and
> max_heap_table variables, too; those decide when the sort goes to disk.
>
>
> Johnny Withers <joh...@pixelated.net> wrote:
>>
>> Just because it says filrsort doesn't mean it'll create a file on disk.
>> Table schema and full query would be helpful here too
>>
>> http://www.mysqlperformanceblog.com/2009/03/05/what-does-using-filesort-mean-in-mysql/
>> On Aug 11, 2013 1:28 PM, "Brad Heller" <b...@cloudability.com> wrote:
>>
>>  Yes sorry, here's the explain. It was taken from MariaDB 5.5.32. Looks like
>>>  there is a lot of filesort goin' on here. Also note that I'm only using the
>>>  first two fields of the covering index (intentionally).
>>>
>>>
>>>  +------+-------------+------------------------+-------+
>>> ------------------------------
>>> +----------------------------+---------+
>>> ------------------------------
>>> +---------+
>>> ------------------------------
>>> +
>>>  | id   | select_type | table                  | type  |
>>> possible_keys
>>>                 | key                        | key_len | ref
>>>                                    | rows    | Extra
>>>                              |
>>>
>>>  +------+-------------+------------------------+-------+
>>> ------------------------------
>>> +----------------------------+---------+
>>> ------------------------------
>>> +---------+
>>> ------------------------------
>>> +
>>>  |    1 | PRIMARY     | <derived2>             | ALL   | NULL
>>>                  | NULL                       | NULL    | NULL
>>>                                     | 1004685 | Using temporary; Using
>>>  filesort                           |
>>>  |    2 | DERIVED     | accounts               | range |
>>>  PRIMARY,unique_account_identifiers | unique_account_identifiers | 257     |
>>>  NULL                                                  |       3 | Using
>>>  where; Using index; Using temporary; Using filesort |
>>>  |    2 | DERIVED     | facts                  | ref   | covering
>>>                  | covering                   | 4       |
>>>  facts.accounts.id                                    |  334895 | Using
>>>  where
>>>                                |
>>>
>>>  +------+-------------+------------------------+-------+
>>> ------------------------------
>>> +----------------------------+---------+
>>> ------------------------------
>>> +---------+
>>> ------------------------------
>>> +
>>>
>>>
>>>  *Brad Heller *| Engineering Lead | Cloudability.com | 541-231-1514 |
>>>  Skype:
>>>  brad.heller | @bradhe <http://www.twitter.com/bradhe> |
>>>  @cloudability<http://www.twitter.com/cloudability>
>>>
>>>
>>>  On Sun, Aug 11, 2013 at 8:45 AM, Johan De Meersman <vegiv...@tuxera.be
>>>
>>>> wrote:
>>>>
>>>
>>>  On my phone now, but it smells of file-based sorting, making disk access
>>>>  the bottleneck. Can you provide the explain?
>>>>
>>>>
>>>>  Brad Heller <b...@cloudability.com> wrote:
>>>>
>>>>>
>>>>>  Hey list, first time posting here so apologies if this is the wrong
>>>>>
>>>>  forum
>>>
>>>>  for this but I'm really out of options on how to solve this problem!
>>>>>
>>>>>  *Short version:*
>>>>>
>>>>>
>>>>>  1. High concurrent reads, performing the same well-indexed query type to
>>>>>  the same two tables.
>>>>>  2. No additional traffic at all--just reads from these two tables. No
>>>>>
>>>>>
>>>>> writes anywhere.
>>>>>  3. Very fast (sub-second) when server is only servicing one request at a
>>>>>  time.
>>>>>  4. Very slow (30s+) when server is servicing 2-3 requests at a time.
>>>>>
>>>>>  Questions:
>>>>>
>>>>>  1. What resource is under contention for servicing read-only queries if
>>>>>
>>>>  you
>>>
>>>>  have a large buffer pool and a plenty-big thread cache?
>>>>>  2. What parameters can I tune to increase concurrent reads to these two
>>>>>  tables?
>>>>>
>>>>>  *Long version:*
>>>>>
>>>>>
>>>>>  I've got a MySQL server that has only about 50 connections open to it at
>>>>>  any given time. It basically only has one OLAP q
>>>>>   uery
>>>>>  type being ran against
>>>>>  it that amounts to something like this:
>>>>>
>>>>>  S
>>>>>  ELECT
>>>>> (3 fields with 1 count) FROM (SELECT (3 fields with 1 aggregate)
>>>>>  FROM table INNER JOIN ... WHERE ... GROUP BY ...) dt GROUP BY ...;
>>>>>
>>>>>  These queries are well indexed and run very well
>>>>>
>>>>  individually--sub-second,
>>>
>>>>  usually even faster. When I run a few of these queries simultaneously
>>>>>
>>>>  (2-3
>>>
>>>>  on my laptop, 6-7 on our production boxes) performance grinds to a halt:
>>>>>  Consistently about 30 seconds to service a query.
>>>>>
>>>>>  I
>>>>>  deally,
>>>>> I'd like to be able to run 50+ of these queries concurrently.
>>>>>
>>>>>  I've tried MySQL 5.5.27 and MySQL 5.6.13 and get the same results on
>>>>>
>>>>  both
>>>
>>>>  machines. I've tried tweaking the following my.cnf parameters to be
>>>>>
>>>>  higher:
>>>
>>>>
>>>>>  thread_concurrency = 20
>>>>>  thread_cache_size = 340
>>>>>  innodb_buffer_pool_size=2G
>>>>>
>>>>>  A few other my.cnf parameters that I have set:
>>>>>
>>>>>  innodb_file_format=Barracuda
>>>>>
>>>>> innodb_file_format_max=Barracuda
>>>>>  innodb_file_per_table=1
>>>>>  skip-external-locking
>>>>>  innodb_log_files_in_group=2
>>>>>  innodb_log_file_size=2000M
>>>>>  max_allowed_packet=64M
>>>>>
>>>>>  Thanks in advance,
>>>>>
>>>>>  Brad Heller
>>>>
>>>>
>>>>
>>>>  --
>>>>  Sent from Kaiten Mail. Please excuse my brevity.
>>>
>>>
>>>
>>>
> --
> Sent from Kaiten Mail. Please excuse my brevity.
>

Reply via email to