executionStats.executionTimeMillis is the overall time for execution. This time is not only the time that the query runs, but it includes the time it takes to generate/pick the execution plan. Do you have multiple indexes that could be used to satisfy this query? Any indexes that have any of the fields in the query will be considered when building out a plan.
As for index optimization, you generally want to have your equality match fields (‘a’, ‘c’ and ‘e’) in your example as the left most fields in your index. Which of those would be placed first would be based on your data and how selective it is. This means the first field in the index would be the one that filters out the most data to be returned.
After your equality match fields, the next fields in the index will generally be used for sorting. The last fields in the index will be used for inequality/range based matches (‘b’ and ‘e’ in your query).
Indexing is an art that must be practiced to get right. Make sure you don’t have unnecessary indexes, and make sure the indexes you do have are optimized for the queries you run the most.