If you have many small textures, consider combining them into a single larger, mosaiced texture. Rather than switching to a new texture before drawing a textured polygon choose texture coordinates that select the appropriate small texture tile within the large texture. Use texture objects to encapsulate texture data. This allows the implementation to compile the texture into a format that is optimal for rendering and, if the system accelerates texturing, to efficiently manage textures on the graphics adapter. Try to keep texture references localized between polygons.
Some implementations use caching to optimize texture mapped rendering.
Keeping the texture references localized when sending a batch of polygons to OpenGL can reduce the cache misses. If necessary, reduce the size or internal format resolution of your textures until they all fit into memory. Use smaller texel sizes. There is often a tradeoff between texel size and the speed of texture filtering, with smaller texel sizes typically performing better. Avoid expensive texture filter modes.