Match Against search not doing exact search?
Plan A:
As you put the data into the table, change - to, say, _ so that such items will be on &quot;word&quot;, not two.  Do a similar change when constructing the AGAINST clause.
If necessary, make an extra column with that and do any other cleansing of the data -- Then index that column with FULLTEXT, but use the original table for output.
Plan B:
MATCH (col) AGAINST ('+CE20' in boolean mode)
AND col LIKE '%CE20-2019%'

Or, if you need a regexp to handle a letter/digit before:
MATCH (col) AGAINST ('+CE20' in boolean mode)
AND col REGEXP '\\bCE20-2019'

(That's for MySQL 8; use [[:&lt;:]] instead of \\b for other versions.  That is &quot;word boundary&quot; and should eliminate most of the 20 extra rows.)
That will run nearly as fast as the original query should have run.
Alas, this requires understanding the incoming data and making programmatic decisions as to how best to construct a fast query.
Note that the use of + when IN BOOLEAN MODE may be the 'right' thing to do for your app.