Yes it's the average size of each row in your table.
row size * N rows = table size
Row size = 83 B
Rows = 22,000,001
Row Size times Number of rows:
83 * 22000001 = 1826000083
Convert result in Giga Bytes:
1826000083 / 1024 / 1024 / 1024 = 1.7
Total = 1.7 GiB
Max
I suppose you could do something like this from the command line/phpmyadmin:
Assuming the following table:
mysql> SELECT * FROM test;
+----+----------+
| id | cat_type |
+----+----------+
| 1 | free |
| 2 | free |
| 3 | free |
| 4 | free |
| 5 | paid |
| 6 | paid |
+----+----------+
6 rows in set (0.00 sec)
Make your custom ordering by selecting twice the table and using a variable as a counter:
mysql> SET @i := 0;
SET @j := 0.5;
SELECT id, cat_type FROM
(SELECT @i := @i + 1 as ordering, id, cat_type FROM test WHERE cat_type = 'free'
UNION
SELECT @j := @j + 2 as ordering, id, cat_type FROM test WHERE cat_type = 'paid')
AS base_table
ORDER BY ordering;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
+----+----------+
| id | cat_type |
+----+----------+
| 1 | free |
| 2 | free |
| 5 | paid |
| 3 | free |
| 4 | free |
| 6 | paid |
+----+----------+
6 rows in set (0.00 sec)
This is technically incorrect, as it could explore the original tables not in id order, but assuming you are using InnoDB, a full table scan in index order should be performed.
Also, this is terribly unoptimized:
+----+-------------------+------------+------+---------------+------+---------+------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------------+------------+------+---------------+------+---------+------+------+-----------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 12 | Using filesort |
| 2 | DERIVED | test | ALL | NULL | NULL | NULL | NULL | 6 | Using where |
| 3 | UNCACHEABLE UNION | test | ALL | NULL | NULL | NULL | NULL | 6 | Using where |
| NULL | UNION RESULT | <union2,3> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+-------------------+------------+------+---------------+------+---------+------+------+-----------------+
4 rows in set (0.00 sec)
To the point that if you wanted to do this in a large table, doing it programatically or using cursors would be a better idea.
Best Answer
Using user variables, you calculate running total for each line like a spreadsheet
PROPOSED QUERY
YOUR SAMPLE DATA
PROPOSED QUERY EXECUTED
PROPOSED QUERY EXPLAINED
Look at the subquery
If you run this with the variables, you see everything being added up for you line by line
The proposed query has the subquery return a lineitem number. I get the last one to show the final total.
Remember the formula from your question ?
The newval column computes the formula