A purely normal table is just a store for data and functions. You access the data and functions directly via the "." operator.
A metatable is a table that you use to set the behavior of another table. Like "normal" tables, metatables have properties that you access with the "." operator. However, they must also include at least one special method called a metamethod. There is a limited number of these metamethods and they are specified in the lua manual. All such methods have a name that begins with a double underscore.
The most important ones, in terms of changing the functionality of a table, as opposed to just making your life easier as a programmer, are probably __index(), __newindex(), and __call(). __index() specifies what happens when you attempt to access a property of your table that does not exist (which normally returns nil) and may be the most commonly used metafunction. One common use for this is in replicating the behavior of object oriented programming, for which there are many guides on the internet. Note, __index can either be a method or a table. If it is a table, then when you try to access a key in your main table that isn't there, lua looks for that key in the __index table. __newindex() specifies what happens when you attempt to create a new index in your main table. __call() specifies what happens when you call your main table as a function. This is perhaps less useful than the other two as you can simply replicate this functionality with a function within your table.
To use a metatable, you need to set your main table's metatable to another with setmetatable(maintable, metatable). This function sets the metatable of maintable as metatable. Then, the metamethods of metatable will act on maintable. For example, if metatable has a __index, It will specify what happens when you try to access a property of maintable that isn't there.
One thing that can be confusing is that metatables can also act as normal tables. In this instance, such a table really serves two independent purposes, with the metamethods providing metatable functionality for another table and with the properties that are not metamethods simply acting as normal table properties for the table used as a metatable for another table. One thing that's even more confusing is when a metatable has its __index pointed to itself. This serves no purpose when accessing the metatable directly, but when you set it as a metatable for another table, when that other table attempts to access its own property that isn't there, it goes to the __index table, which is also its metatable. Lua is confusing like that. Understanding this might be the biggest part of the learning curve and why I say there is one but it's small.
My recommendation is to just search for lua __index() in youtube. Learning what __index() does will probably help you understand metatables in general.
Here is a nice tutorial that explains this stuff.
http://lua-users.org/wiki/MetamethodsTutorial