i am working on mysql database with InnoDb storage engine. 
my table structure are as follows: 

Table Name : archiveincomingsms

![enter image description here](https://i.stack.imgur.com/mdYSv.png)

Index Detail of : archiveincomingsms

![enter image description here](https://i.stack.imgur.com/SI3xP.png)

Table Name : archiveoutgoingsms
![enter image description here](https://i.stack.imgur.com/gKwAc.png)

Index Detail of : archiveoutgoingsms
![enter image description here](https://i.stack.imgur.com/EPXkk.png)

Above are my table structure and their index detail !

Both table have minimum more then 1 billion records(rows) respectively.

Now Problem is that when i would like to execute following SqlQuery : 

```
      ( SELECT  id AS ID, `recieved_datetime` `Date`, 'MT' AS Type, src_adress AS Msisdn,
               TEXT as text, CHAR_LENGTH(TEXT) AS QtyOfSymbols, 'OK' AS `Status`
            FROM  archiveincomingsms
            WHERE  1=1
              AND  recieved_datetime BETWEEN '2015-06-14 00:00:00'
                                         AND '2015-07-14 23:59:59'
      )
    UNION  ALL
      ( SELECT  id AS ID, `send_date` `Date`, 'MO' AS Type, scr_adress AS Msisdn,
                TEXT as text, CHAR_LENGTH(TEXT) AS QtyOfSymbols, 'OK' AS `Status`
            FROM  archiveoutgoingsms
            WHERE  1=1
              AND  send_date BETWEEN '2015-06-14 00:00:00'
                                 AND '2015-07-14 23:59:59'
      )
    ORDER BY  `Date` ASC
    LIMIT  0 ,100 

```

Above query takes more than 30 second time to get data from tables.
and Another one is i have to count number of row too for pagination purpose and it also take more then 30 second time.

Overall it takes more than 1 minute to execute.
Is there any proper way to optimize time ? 
i have to take down into maximum 5 sec. ! How can it possible ? 
I am using mysql database !