sql >> データベース >  >> RDS >> Mysql

単純なインデックスの最適化

    上記のコメントで説明されているように、INDEX(Dob) 使用されません-これは年-月-日のインデックスであるため 。 月-日にインデックスを作成する必要があります 。

    おそらく最も洗練されたソリューションではありませんが、:

    CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
                                `Mob` int, `Dob` int, 
                                PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));
    

    http://sqlfiddle.com/#!2/db82ff/1 を参照してください。

    より良い(?)答えの場合:MySQLは計算列をサポートしていないため、「月日」列にデータを入力し、それにインデックスを付けるためのトリガーが必要になる場合があります:

    CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
                                `Dob` DATE,
                                `Birthday` CHAR(5),
                                PRIMARY KEY (Email), INDEX(`Birthday`));
    
    CREATE TRIGGER ins_bithdayCard BEFORE INSERT ON `birthdayCard`
    FOR EACH ROW
        SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
    
    CREATE TRIGGER upd_bithdayCard BEFORE UPDATE ON `birthdayCard`
    FOR EACH ROW
        SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
    

    これにより、「単純な」挿入が可能になり、必要に応じて完全なDobが保持されます。 元の例のように:

    insert into birthdayCard (Email, FirstName, LastNAme, Dob) 
       values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');
    

    SELECT 新しい「検索」列を使用するには、クエリを変更する必要があります:

    SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
    

    Sett http://sqlfiddle.com/#!2/66111/3



    1. ハイブリッドクラウドセットアップでのMariaDBの実行

    2. mysqlを使用して毎週のコホート分析テーブルを作成するにはどうすればよいですか?

    3. OracleDBのテーブルから2番目に高い値

    4. Herokuで時折Postgresエラーが発生しました:ホスト名<pg URL>をアドレスに変換できませんでした:名前またはサービスが不明です(PG ::Error)