sql >> Databáze >  >> RDS >> Mysql

mysql rád porovnává celé slovo nebo začátek slova v řetězci

Jak již bylo uvedeno v otázce dotaz

$query = 'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE "' . $searchText . '%"'
                                . 'OR SEARCHFIELD LIKE "% ' . $searchText . '%"'

funguje pro odpovídající záznamy, kde je SEARCHFIELD obsahuje slovo, které začíná (nebo je rovno) $searchText

Pokud jde o výkon, provedl jsem test na svém vývojovém stroji MBP 2,2 GHz i7 quad core :

Hledání slova na 4 000 záznamech trvá přibližně 40 milisekund.

Záznamy jsou normálně indexovány (žádný fulltext).

Mám několik tisíc záznamů a dotaz se nespouští příliš často, takže pro mě je to dobré.
Řešení nemusí být vhodné pro jiné kontexty.

K vytvoření připraveného příkazu s výše uvedeným dotazem jsem použil techniku ​​popsanou zde:

Uniknutí zástupných karet MySQL

Výsledný kód je následující:

function like($s, $e)
{
    return str_replace(array($e, '_', '%'), array($e . $e, $e . '_', $e . '%'), $s);
}

/* ... */

/* create a prepared statement */
$stmt = $mysqli->prepare(
    'SELECT * FROM MYTABLE WHERE SEARCHFIELD LIKE ? ESCAPE "=" OR SEARCHFIELD LIKE ? ESCAPE "="'
); 

if( $stmt )
{
    /* escape the text */
    $escSearchText = like( $searchText, "=" );

    /* 'like' parameters */
    $like1 = $escSearchText . "%";
    $like2 = "%" . $escSearchText . "%";

    /* bind parameters for markers */
    $stmt->bind_param( "ss", $like1, $like2 );

/* ... */


  1. Ovlivňuje objednávka Sql JOIN výkon?

  2. Parametr Sniffing Primer

  3. přepsání modu, nadpis slugs a htaccess

  4. Skryté vlastnosti PostgreSQL