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

MySQLの`FORCEINDEX`のユースケース?

    FORCE INDEXは、FKと参照値の両方が主キーではないVARCHARフィールドに複数の結合とサブクエリがあり、同時にDATEフィールドにwhere句がある場合に役立つことに気付きました。

    次のようなもの:

    SELECT NAME, a.reference_no, i.value, p.value FROM customers AS c
    INNER JOIN accounts AS a ON c.id = a.customer_id
    INNER JOIN invoices AS i ON i.reference_no = a.reference_no
    INNER JOIN payments AS p ON p.invoice_no = i.invoice_no
    WHERE payments.date >= '2011-09-01' AND DATE < '2011-10-01';
    

    mysqlは常にPKとFKを使用します。ここで、最初に支払いテーブルのpayment_dateインデックスを使用します。これは、最大のものであるためです。したがって、FORCE INDEX(payment_date) 支払いテーブルの結合は大いに役立ちます。

    これは、私たちが職場で使用しているサードパーティの課金データベースの例です。最適化には大きな問題があり、ほとんどの場合FORCEINDEXがその役割を果たしました。通常、mysqladminで遅いクワイアを見つけ、FORCE INDEXでテストし、ベンダーに送信して、アプリのソースコードに書き換えます。

    例をよりよく理解するための4つの表を次に示します。

    CREATE TABLE `customers` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` varchar(100) NOT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
    
    CREATE TABLE `accounts` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `customer_id` int(11) NOT NULL,
      `reference_no` varchar(10) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `reference_no_uniq` (`reference_no`),
      KEY `FK_accounts` (`customer_id`),
      CONSTRAINT `FK_accounts` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
    
    CREATE TABLE `invoices` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `reference_no` varchar(10) NOT NULL,
      `invoice_no` varchar(10) NOT NULL,
      `value` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `invoice_no_uniq` (`invoice_no`),
      KEY `FK_invoices` (`reference_no`),
      CONSTRAINT `FK_invoices` FOREIGN KEY (`reference_no`) REFERENCES `accounts` (`reference_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
    
    CREATE TABLE `payments` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `invoice_no` varchar(10) NOT NULL,
      `value` int(11) NOT NULL,
      `date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `FK_payments` (`invoice_no`),
      KEY `payment_date` (`date`),
      CONSTRAINT `FK_payments` FOREIGN KEY (`invoice_no`) REFERENCES `invoices` (`invoice_no`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
    


    1. Node.js MSSQL tedius ConnectionError:localhost:1433への接続に失敗しました-ECONNREFUSEDに接続します

    2. WindowsへのOracleDatabase12cソフトウェアのインストール

    3. 例外:この接続に関連付けられている開いているDataReaderがすでにあり、最初に閉じる必要があります

    4. OracleでTimestamp_to_scnとScn_to_timestampを使用するにはどうすればよいですか?