MySQL slow select query
SHOW CREATE TABLE is more descriptive than DESCRIBE.  And easier to read.

(I am removing the "bp", which I find as being distracting clutter:)

SELECT  p.id
    FROM  words w
    JOIN  productwords pw  ON pw.wordid = w.id
    JOIN  products p  ON p.id = pw.productid
    WHERE  w.word = 'nike'
      AND  p.price &gt; 0
    ORDER BY  pw.productid DESC
    LIMIT  100


If the tables are not InnoDB, convert to such.

productwords seems to be a many:many mapping table; see here for advice on improving its performance .

18K rows after a moderately complex query could reasonably take 1.4 seconds.  Some more things to ask:


How much RAM?
Value of innodb_buffer_pool_size?
Disk subsystem (HDD/SSD, etc)?
What will you do with 18K ids or even 100?  Turn around and ask for more data from some table?  That will be inefficient.


The complexity prevents scanning fewer than 18K rows, even with the LIMIT 100.  OTOH, if you get rid of all references to products would probably speed it up some.