MySQL表上的索引会提高我的网站性能吗?
我有两个非常简单的表格:MySQL表上的索引会提高我的网站性能吗?,mysql,sql,Mysql,Sql,我有两个非常简单的表格: CREATE TABLE `tbl_words` ( `fld_id` int(11) NOT NULL AUTO_INCREMENT, `fld_word` varchar(255) DEFAULT NULL, `fld_cat_id` int(11) DEFAULT NULL, PRIMARY KEY (`fld_id`) ); 这有一个很长的单词列表,其中列出了大约10500个单词。每个单词中都有一个CatID,对应于此表中的一个单词类别: CR
CREATE TABLE `tbl_words` (
`fld_id` int(11) NOT NULL AUTO_INCREMENT,
`fld_word` varchar(255) DEFAULT NULL,
`fld_cat_id` int(11) DEFAULT NULL,
PRIMARY KEY (`fld_id`)
);
这有一个很长的单词列表,其中列出了大约10500个单词。每个单词中都有一个CatID,对应于此表中的一个单词类别:
CREATE TABLE `j_word_cat` (
`fld_id` int(11) NOT NULL AUTO_INCREMENT,
`fld_cat` varchar(255) DEFAULT NULL,
PRIMARY KEY (`fld_id`)
);
从这些表中获取数据的页面每月可获得约500000次页面浏览量。表中的数据是相当静态的,很少更新
我发现我使用的MySQL数据库每天都会返回很多这样的错误:
查询期间与MySQL服务器的连接中断
我想知道——如果我在“tbl_单词”表中添加一个新的索引,例如一个名为“catID”的索引,并链接到“fld_cat_id”列,性能会得到改善吗
或者我应该创建一个同时使用fld_id和fld_cat_id的索引吗
任何建议都将不胜感激
谢谢
更新
我的查询非常简单——实际上我并没有加入表
用户从j_word_cat表中选择一个类别,然后使用该ID生成一个随机的单词列表,例如我正在运行的一些常见查询:
-- Category table to populate SELECT drop down list of categories:
SELECT fld_cat, fld_id FROM j_word_cat ORDER BY fld_cat;
-- common word table selects:
-- the NOT IN bit is to exclude one category which I want to exclude by default unless the user actually chooses it
SELECT fld_word FROM tbl_words WHERE fld_cat_id NOT IN (24) ORDER BY RAND() LIMIT 50;
-- note that the value of 15 would vary depending on the category the user selected
-- 15 is just an example
SELECT fld_word FROM tbl_words WHERE fld_cat_id = 15 ORDER BY RAND() LIMIT 50;
SELECT fld_word FROM tbl_words ORDER BY RAND() LIMIT 60;
根据您的查询,您需要以下索引
j_word_cat(fld_cat) # because you are sorting by this field
tbl_words(fld_cat_id) # because you are filtering by this field
由于您没有加入表,也没有按不同的列进行筛选,因此不应该创建不需要的复合索引
我会推荐你去读那些对我帮助很大的书。注意:它有点老,讲的是SQL server,但了解SQL索引非常有用。索引会加快选择速度,降低插入和更新速度,但是我经常处理具有数百万条记录的表,如果使用适当的索引,我们可以将查询速度从4到5分钟降低到1秒以下,对插入和更新的影响可以忽略不计 如果您创建了一些索引并想知道它们是否被使用,那么您可以使用mysql解释工具查看您的查询
EXPLAIN SELECT fld_word
FROM tbl_words WHERE fld_cat_id NOT IN (24)
ORDER BY RAND() LIMIT 50;
在结果中,您将看到一个可能的索引列表和最终选定的索引。请特别注意“rows”列,因为这将显示它必须为结果中的每个表扫描多少行
最终,您希望争取在服务器上运行零个未编制索引的查询,并且运行的查询应该扫描尽可能少的行。。我的建议是打开mysql.ini文件中的未索引查询日志,并在合理的情况下修复所有查询
如果您加入、订购或使用where可以提高性能,如果您只选择无序信息而不加入,则不会
应为fld_cat_id编制索引
您的主键应该声明为主键。如果您想完全优化它们,那么请使它们不为null、无符号、自动递增,并将它们指定为主键
如果您正在执行类似于where fld_word='bla'的操作,那么应该将其与使用的任何连接键一起编入索引
如果您有一个小型数据库,那么性能的提高可以忽略不计,但是这并不是懒惰于良好设计的理由
更多阅读: