lib/ecto_mysql_extras/queries/total_index_size.ex

defmodule EctoMySQLExtras.TotalIndexSize do
  @moduledoc """
  Query the total size of all indexes in the `Ecto.Repo` database.

  Primary indexes are not included since InnoDB uses it as the clustered index,
  the size represents the table itself.

  Data is retrieved from the `information_schema` database and the `tables` table.
  """
  @behaviour EctoMySQLExtras

  def info do
    %{
      title: "Total size of all indexes (excluding PRIMARY indexes) in MB",
      columns: [
        %{name: :size, type: :bytes}
      ]
    }
  end

  def query(_args \\ []) do
    """
    /* ECTO_MYSQL_EXTRAS: #{info().title} */

    SELECT CAST(COALESCE(SUM(INDEX_LENGTH),0) AS UNSIGNED) AS `size`
    FROM information_schema.tables
    WHERE TABLE_SCHEMA = DATABASE();
    """
  end
end