Index on integer and string fields
MyISAM! Shame.  Switch to InnoDB.

Don't worry about that PRIMARY KEY; it is too much hassle to split it up, etc.  But do make sure it is the 'appropriate' character set:

VARCHAR(21) CHARACTER SET ascii


If it is case sensitive, then add on COLLATE ascii_bin.

Yes, there is a memory and disk penalty.  But there are tradeoffs with speed, simplicity, etc.

(If it were 100 characters long, I might give a different answer.)

Numbers for MyISAM

In MyISAM, assuming the strings are half length on average:
PRIMARY KEY(decimal_14_0, varchar_7) needs 2*(7+(1+3.5)) bytes.
PRIMARY KEY(varchar_21) needs 2*(1+(13.5+3.5)) 


2* because PK fields stored with data and with index;
7 bytes for DECIMAL(14,0);
1=length field for VARCHAR;
3.5(?)=avg bytes for up-to-7-char suffix; 
13.5(?) for avg # digits in prefix.


After cancelling out things, the diff is 2*(13.5-7)=13 bytes smaller per row (data+pk) for DECIMAL+VARCHAR. 300M*13=4GB.

(InnoDB computation is in Comments.)