MYSQL Including Missing Values Using the Previous Most Recent Record
If I understand the question correctly you want the lag value where there is no direct value.

Permit me a little OCD.  Steer well clear of any table or field names that are reserved words in any of the ANSI or ODBC standards or MySQL reserved words.
I would ditch the tbl_ prefix as well.

I've renamed your date field to Perioddate

Try this

SELECT  v2.type_id,DT.PeriodDate, V2.my_value
FROM (
    SELECT C.PeriodDate,MAX(V1.PeriodDate) AS PrecedingDate
    FROM tbl_calendar AS C
        LEFT JOIN tbl_values AS V1
        ON C.PeriodDate&gt;=V1.PeriodDate
        AND V1.type_id = 100
    GROUP BY C.PeriodDate
) AS DT
    INNER JOIN  tbl_values AS V2
    ON DT.PrecedingDate = V2.PeriodDate
    AND V2.type_id = 100


The way it works is that the derived table builds up a list of dates and the highest date in the values table that is either less than or the same as the entry in the calendar table.  If there is no value the same then the highest date will be the preceding date. 

On the subject of indexes make sure that your most selective column comes first i.e. the PeriodDate column, followed by your type_id.

What does the auto_increment column give you apart from a surrogate key?
If PeriodDate and type_id should be unique then make this your primary key.

I don't know if the query optimiser in MySQL does anything special with unique keys but it certainly does in other DB platforms.