索引的建立及优化-三表分析
1.三表优化数据
CREATE TABLE IF NOT EXISTS `class`(
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`id`)
);
运行一定次数下列sql
INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
CREATE TABLE IF NOT EXISTS `book`(
`book_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`book_id`)
)
运行一定次数下列sql
INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
CREATE TABLE IF NOT EXISTS `phone`(
`phoneid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY(`phoneid`)
)ENGINE=INNODB
运行一定次数下列sql
INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)))
2.分析
查询 EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card LEFT JOIN phone ON book.card=phone.card
在phone表中建立索引
CREATE INDEX index_card ON phone(card)
在book表中建立索引
CREATE INDEX index_card ON book(card)
查看索引
SHOW INDEX FROM phone
SHOW INDEX FROM book
查询结果
EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card LEFT JOIN phone ON book.card=phone.card
结论:后两行查询type都是ref且总的rows优化很好,效果不错。因此索引最好设置在经常需要查询的字段中
JOIN语句优化
1.尽可能的减少join语句中的NestedLoop(嵌套循环)的循环总次数:“永远用小结果集驱动大结果集” 小表驱动大表
2.优先优化NestedLoop(嵌套循环)里面的内层循环;
3.保证Join语句中被驱动表上Join条件字段已经被索引
4.当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝啬JoinBuffer的设置