sql >> Databasteknik >  >> RDS >> Mysql

Regexp och mysql:finns det en AND-operator

Om du behöver sofistikerade sökfunktioner, använd en fulltextsöklösning.

I MySQL, det inbyggda fulltextsökindex funktionen fungerar endast i MyISAM-lagringsmotorn. Detta är olyckligt, eftersom InnoDB är den föredragna lagringsmotorn för alla MySQL-tabeller. InnoDB i de senaste versionerna av MySQL är i de flesta fall snabbare än MyISAM och har bättre funktioner för kraschåterställning än MyISAM.

Det har kommit uttalanden från MySQL-dev-teamet att de avser att implementera ett fulltextindex för InnoDB. Men vi är många månader eller till och med år ifrån att detta är tillgängligt, och det kommer säkerligen att kräva uppgradering till någon senare version av MySQL.

Om du måste använda MyISAM fulltextindex, föreslår jag att du lagrar dina data primärt i InnoDB och sedan lagrar en kopia av den sökbara texten i en MyISAM-tabell.

Du kan också använda en extern lösning som Sphinx Search eller Apache Solr att tillhandahålla fulltextsökningsmöjligheter externt till databasen. Det finns till och med ett sätt att använda ett Sphinx Search-index via det pluggbara MySQL-lagringsmotorgränssnittet .

Jag gillar inte att använda LIKE med jokertecken eller REGEXP för fulltextsökningar. Dessa lösningar medför genomsökningar av hela tabeller för varje sökning, och beroende på volymen av din data, körs hundratals eller tusentals gånger långsammare än om du har ett index.

Jag skrev en jämförelse av fulltextsöklösningar för MySQL i min presentation, "Praktisk fulltextsökning i MySQL ," och även i ett kapitel i min bok SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

uppdatering:MySQL 5.6 är för närvarande under utveckling (från och med februari 2012) och implementerar en fulltext indexlösning för InnoDB.



  1. GROUP_CONCAT flera fält med en annan avgränsare

  2. 3 sätt att lista alla lagrade procedurer som refererar till en tabell i PostgreSQL

  3. Anslut till en fjärransluten MySQL-databas med Android

  4. Hur man ställer in SQL_BIG_SELECTS=1 i Laravel Join-satsen