sql >> Database >  >> RDS >> Mysql

Hoe zoek ik naar rijen die een subtekenreeks bevatten?

Nou, je kunt altijd proberen WHERE textcolumn LIKE "%SUBSTRING%" - maar dit is gegarandeerd vrij traag, omdat uw zoekopdracht geen indexovereenkomst kan doen omdat u naar tekens aan de linkerkant zoekt.

Het hangt af van het veldtype - een tekstgebied wordt meestal niet opgeslagen als VARCHAR, maar eerder als (een soort) TEXT-veld, dus je kunt de MATCH TEGEN telefoniste.

Om de kolommen te krijgen die niet overeenkomen, plaatst u gewoon een NOT voor:WHERE textcolumn NOT LIKE "%SUBSTRING%" .

Of de zoekopdracht hoofdlettergevoelig is of niet, hangt af van hoe u de gegevens opslaat, met name welke COLLATION u gebruikt. Standaard is de zoekopdracht niet hoofdlettergevoelig.

Bijgewerkt antwoord om de vraagupdate weer te geven:

Ik zeg dat het doen van een WHERE field LIKE "%value%" is langzamer dan WHERE field LIKE "value%" als het kolomveld een index heeft, maar dit is nog steeds aanzienlijk sneller dan het ophalen van alle waarden en het hebben van uw toepassingsfilter. Beide scenario's:

1/ Als u SELECT field FROM table WHERE field LIKE "%value%" doet , zal MySQL de hele tabel scannen en alleen de velden met "waarde" verzenden.

2/ Als u SELECT field FROM table . doet en laat je applicatie (in jouw geval PHP) alleen de rijen filteren met "value" erin, MySQL zal ook de hele tabel scannen, maar alle velden naar PHP sturen, die dan extra werk moet doen. Dit is veel langzamer dan geval #1.

Oplossing:gebruik a.u.b. de WHERE clausule, en gebruik EXPLAIN om de uitvoering te zien.



  1. Voor de laatste keer, NEE, u kunt IDENT_CURRENT() niet vertrouwen

  2. Hoe helpt pgBouncer om Django te versnellen?

  3. Hoe combineer ik gegevens uit twee afzonderlijke tabellen in een enkele cursor?

  4. Hoe haal ik alle rijen in mijn DB op?