我有两个非常简单的表:
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`)
);
这里有很长的单词列表,其中列出了大约10,500个单词。每个单词中都有一个CatID,它对应于此表中的单词类别:
CREATE TABLE `j_word_cat` (
`fld_id` int(11) NOT NULL AUTO_INCREMENT,
`fld_cat` varchar(255) DEFAULT NULL,
PRIMARY KEY (`fld_id`)
);
从这些表中获取数据的页面每月可获得大约500,000次页面查看。表中的数据非常静态,很少(如果有的话)更新。
我发现我正在使用的MySQL数据库每天都会返回一些错误:
查询期间与MySQL服务器的连接丢失
我想知道 - 如果我在“tbl_words”表中添加新索引(例如,名为“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;
答案 0 :(得分:0)
根据您的疑问,您需要以下索引
j_word_cat(fld_cat) # because you are sorting by this field
tbl_words(fld_cat_id) # because you are filtering by this field
由于您没有加入表,并且没有按不同的列进行过滤,因此不应创建不需要的复合索引。
我建议你阅读帮助了我很多的this article。注意:它有点旧,并且谈论SQL服务器,但它对于理解SQL索引非常有用。
答案 1 :(得分:0)
索引将加速选择并减慢插入和更新,但是我经常处理具有数百万条记录的表格,我们可以使用适当的索引将查询速度从4到5分钟降低到不到1秒,其中对插入和更新的影响可以忽略不计。
如果您创建了一些索引并想知道它们是否被使用,那么您可以使用mysql Explain工具查看您的查询
EXPLAIN SELECT fld_word
FROM tbl_words WHERE fld_cat_id NOT IN (24)
ORDER BY RAND() LIMIT 50;
在您的结果中,您将看到可能的索引列表和最终选择的索引。请特别注意“行”列,因为这将显示它必须扫描结果中每个表的行数。
最终,您希望在服务器上运行零无索引查询,并且运行的查询应扫描尽可能少的行。我的建议是在mysql.ini文件中打开未编入索引的查询日志,修复所有合理的查询。
如果您加入或订购或使用它将提高性能,如果您只是选择无序信息而不加入则不会。
fld_cat_id应编入索引
您的主键应该如此声明。如果要完全优化它们,请将它们设置为null,unsigned,auto_increment并将它们指定为主键。
如果您正在执行fld_word ='bla'之类的操作,则应将其与所使用的任何连接键一起编入索引。
如果你有一个小型数据库,那么性能提升可以忽略不计,但是没有理由对好的设计保持懒惰。
更多阅读: